设计细颗粒度的持久类并且使用<component>来实现映射。

使用一个Address持久类来封装 street, suburb, state, postcode. 这将有利于代码重用和简化代码重构(refactoring)的工作。

对持久类声明标识符属性。

Hibernate中标识符属性是可选的,不过有很多原因来说明你应该使用标识符属性。我们建议标识符应该是“人造”的(自动生成,不涉及业务含义),并且不是基本类型。为了最大的灵活性,应该使用java.lang.Long or java.lang.String

自然主键标志符

对所有使用自然主键标志符的尸体使用<natural-id>,实现equals()和hashCode()方法来比较树型。

为每个持久类写一个映射文件

不要把所有的持久类映射都写到一个大文件中。把 com.eg.Foo 映射到com/eg/Foo.hbm.xml中, 在团队开发环境中,这一点显得特别有意义。

把映射文件作为资源加载

把映射文件和他们的映射类放在一起进行部署。

考虑把查询字符串放在程序外面

如果你的查询中调用了非ANSI标准的SQL函数,那么这条实践经验对你适用。把查询字符串放在映射文件中可以让程序具有更好的可移植性。

使用绑定变量

就像在JDBC编程中一样,应该总是用占位符"?"来替换非常量值,不要在查询中用字符串值来构造非常量值!更好的办法是在查询中使用命名参数。

不要自己来管理JDBC connections

Hibernate允许应用程序自己来管理JDBC connections,但是应该作为最后没有办法的办法。如果你不能使用Hibernate内建的connections providers,那么考虑实现自己来实现net.sf.hibernate.connection.ConnectionProvider

考虑使用用户自定义类型(custom type)

net.sf.hibernate.UserType. 假设你有一个Java类型,来自某些类库,需要被持久化,但是该类没有提供映射操作需要的存取方法。那么你应该考虑实现net.sf.hibernate.UserType接口。这种办法使程序代码写起来更加自如,不再需要考虑类与Hibernate type之间的相互转换。

在性能瓶颈的地方使用硬编码的JDBC

在对性能要求很严格的一些系统中,一些操作(例如批量更新和批量删除)也许直接使用JDBC会更好,但是请先搞清楚这是否是一个瓶颈,并且不要想当然认为JDBC一定会更快。如果确实需要直接使用JDBC,那么最好打开一个 Hibernate Session 然后从 Session获得connection,按照这种办法你仍然可以使用同样的transaction策略和底层的connection provider。

理解Session清洗( flushing)

Session会不时的向数据库同步持久化状态,如果这种操作进行的过于频繁,那么性能会受到一定的影响。有时候你可以通过禁止自动flushing尽量最小化非必要的flushing操作,或者更进一步,在一个特殊transaction中改变查询和其它操作的顺序。

在三层架构中,考虑使用Detached对象

当使用servlet / session bean体系结构的时候,需要使用Session读取持久对象,并将值对象传递到servlet / JSP层。为每一个请求使用一个新的Session。使用Session.merge()或者Session.saveOrUpdate()方法来让对象与数据库同步。

在两层架构中,考虑使用长持久上下文

为了提高性能,数据库事务应该尽可能短。然而在实际业务中经常需要实现长时间运行的应用事务,每个用户的每个视图使用一个简单的工作单元。应用程序事务将横跨多个客户请求响应周期。通常情况下,使用Detached对象来实现应用程序事务。在两层体系结构中,通常,比较恰当的方法是在整个应用事务中维护一个单一的打开的持久连接(Session),然后在每个请求结束时简单的关闭掉JDBC连接,然后在并发请求中,重新连接它们。

不要把异常看成可恢复的

这一点甚至比“最佳实践”还要重要,这是“必备常识”。当异常发生的时候,回滚 Transaction ,关闭Session。如果你不这样做的话,Hibernate无法保证内存状态精确的反应持久状态。尤其不要使用Session.load()来判断一个给定标识符的对象实例在数据库中是否存在,应该使用find()。当然,有一些例外情况,比如说StaleObjectStateExceptionObjectNotFoundException

补充:运行时异常 和 编译时异常

编译时异常 必须要在代码中 catch,否则无法通过编译

运行时异常 可以不显式的去catch

对于关联优先考虑lazy fetching

谨慎的使用主动外连接抓取(eager (outer-join) fetching)。对于大多数没有JVM级别缓存的持久对象的关联,应该使用代理(proxies)或者具有延迟加载属性的集合(lazy collections)。对于被缓存的对象的关联,尤其是缓存的命中率非常高的情况下,应该使用outer-join="false",显式的禁止掉eager fetching。如果那些特殊的确实适合使用outer-join fetch 的场合,请在查询中使用left join

使用Open Session In View模式或者Disciplined Assembly Phase来消除获取数据时产生的问题

Hibernate允许开发冗长的数据传输对象(DTO)。在传统的EJB体系结构中,使用DTOs具有两个目的:第一,他们解决了实体Bean没有实现serializable接口的问题;第二,他们在为表示层提供数据时,DTO对象屏蔽了一些对象间的关联操作。Hibernate排除了第一种情况。然而,仍然需要一个连接阶段(设想业务逻辑严格定义表示层使用的数据对象),否则,在表现层渲染阶段就可能会将持久传递到表现层了。这不是Hibenate的局限性,这是保证事务性数据访问的基础原则。

考虑把Hibernate代码从业务逻辑代码中抽象出来

把Hibernate的数据存取代码隐藏到接口(interface)的后面,组合使用DAOThread Local Session模式。通过Hibernate的UserType,你甚至可以用硬编码的JDBC来持久化那些本该被Hibernate持久化的类。 (该建议更适用于规模足够大应用软件中,对于那些只有5张表的应用程序并不适合。)

不要使用外连接映射

好的真正的many-to-many连接是非常稀少的。多数时候,需要在链接表中存储附加信息。由于这个原因,使用两个one-to-many连接来代替一个中介的链接类是更明智的选择。事实上,更多的连接情况应该是one-to-many和many-to-one的,应该小心使用其它种类的连接,如果设计中确实出现了其它种类的连接情况,仔细审查一下,以确认他们是必须的。

使用与业务有关的键值来实现equals()hashCode() .

如果你在Session外比较对象,你必须要实现equals()hashCode()。在Session内部,Java的对象识别可以值得信赖。如果你实现了这些方法,不要再使用数据库辨识!瞬时对象不具有标识值,Hibernate会在对象被保存的时候赋予它一个值。如果对象在被保存的时候位于Set内,hash code就会变化,要约就被违背。为了实现用与业务有关的键值编写equals()hashCode(),你应该使用类属性的唯一组合。记住,这个键值只是当对象位于Set内部时才需要保证稳定且唯一,并不是在其整个生命周期中都需要(不需要达到数据库主键这样的稳定性)。绝不要在equals()比较中使用集合(要考虑延迟装载),这些相关联的类可能被代理过。

不要用怪异的连接映射

多对多连接用得好的例子实际上相当少见。大多数时候你在“连接表”中需要保存额外的信息。这种情况下,用两个指向中介类的一对多的连接比较好。实际上,我们认为绝大多数的连接是一对多和多对一的,你应该谨慎使用其它连接风格,用之前问自己一句,是否真的必须这么做。

Hibernate最佳实践相关推荐

  1. 编写高性能Java代码的最佳实践

    编写高性能Java代码的最佳实践 摘要:本文首先介绍了负载测试.基于APM工具的应用程序和服务器监控,随后介绍了编写高性能Java代码的一些最佳实践.最后研究了JVM特定的调优技巧.数据库端的优化和架 ...

  2. Spring Validation最佳实践及其实现原理,参数校验没那么简单!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:六点半起床 juejin.im/post/685654110 ...

  3. 事务管理最佳实践多余的话之一“每次请求,一次数据库连接,一次事务”是不是金科玉律?...

    事务管理最佳实践多余的话之一 ----"每次请求,一次数据库连接,一次事务"是不是金科玉律? 前言 <事务管理最佳实践全面解析>一文发表之后,关于事务管理最佳实践,还有 ...

  4. 事务管理最佳实践全面解析

    事务管理最佳实践全面解析 前言 写作这篇文章的起因,是前一段时间,我使用Jbpm工作流引擎开发工作流管理系统的过程中,使用编程方式管理事务时遇到的问题. 由于之前很长一段时间,我一直都在使用Sprin ...

  5. 后端传输大量log数据_京东智联云MySQL读写分离最佳实践 ,轻松搞定数据库高性能扩展...

    数字化时代,数据库对任何企业而言都是其应用的核心资源.MySQL作为当前最流行的关系型数据库,虽然是开源软件,但是其简单易懂.易于部署管理,且具有ACID特性.强大的SQL查询等特点,被各种业务系统作 ...

  6. mysql数据库设计实践_MYSQL教程分享20个数据库设计的最佳实践

    <MYSQL教程分享20个数据库设计的最佳实践>要点: 本文介绍了MYSQL教程分享20个数据库设计的最佳实践,希望对您有用.如果有疑问,可以联系我们. MYSQL教程数据库设计是整个程序 ...

  7. Maven最佳实践:版本管理

    Maven最佳实践:版本管理 什么是版本管理 首先,这里说的版本管理(version management)不是指版本控制(version control),但是本文假设你拥有基本的版本控制的知识,了 ...

  8. Spring Validation 最佳实践及其实现原理,参数校验没那么简单!

    之前也写过一篇关于Spring Validation使用的文章,不过自我感觉还是浮于表面,本次打算彻底搞懂Spring Validation.本文会详细介绍Spring Validation各种场景下 ...

  9. 20个数据库设计的最佳实践

    数据库设计是整个程序的重点之一,为了支持相关程序运行,最佳的数据库设计往往不可能一蹴而就,只能反复探寻并逐步求精,这是一个复杂的过程,也是规划和结构化数据库中的数据对象以及这些数据对象之间关系的过程. ...

最新文章

  1. 关于使用Nginx服务器发布静态网页或者代理
  2. 机器学习算法总结--提升方法
  3. 【Flink】 Flink与Kafka版本对应关系
  4. [转]综述论文翻译:A Review on Deep Learning Techniques Applied to Semantic Segmentation
  5. 微信小程序实例源码下载
  6. matlab计算梁截面特性,MATLAB环境下叶片截面几何特性计算程序的设计
  7. 阿里云周明:因云而生的基础设施
  8. 《 Python程序设计项目案例》—学生成绩(信息)管理系统普通版设计要求及部分参考代码(期末大作业、结课项目)
  9. 中烟工业考计算机知识吗,广东烟草局中烟工业常见备考问题解答
  10. linux批量更新文件夹里,Linux下使用touch批量修改文件夹和文件的时间
  11. logstash 日志_面试和书评:LogStash书,使日志管理变得容易
  12. 装系统计算机丢失msi,msi电脑一键重装系统win10详细步骤
  13. 互联网IT就业市场,你要说最有市场的一定是它
  14. html5 自动扣图,js+html5 canvas实现ps钢笔抠图
  15. SLAM、SFM、MVG与MVS的区别和联系
  16. 单目-线激光三维扫描系统中光刀平面的标定
  17. x230黑苹果的一点经验
  18. 【PXI 虹科科普文】-- PXIe机箱介绍
  19. 查询字符串最长公共前缀
  20. 无盘服务器的优缺点,网众无盘服务器建议

热门文章

  1. 苹果成AI“收购狂魔”,5年买下25家公司
  2. GAN不只会造假:捕获数据中额外显著特征,提高表征学习可解释性,效果超越InfoGAN | IJCAI 2020...
  3. 要啥给啥的写作AI:新闻评论小说都能编,题材风格随便选,真假难辨,16亿参数模型已开源...
  4. 合作方变股东:Aurora无人车获现代汽车3千万美元投资,与大众分手
  5. asyncio之Coroutines,Tasks and Future
  6. angular 学习理解笔记
  7. 博弈论入门之威佐夫博弈
  8. 微信小程序之圆形进度条(自定义组件)
  9. web人力资源信息系统开发日志②
  10. 营销系统--手动补偿