设计细颗粒度的持久类并且使用<component>来实现映射。
例如使用一个Address持久类来封装 street, suburb, state, postcode. 这将有利于代码重用和简化代码重构(refactoring)的工作。
对持久类声明标识符属性( identifier properties)。
Hibernate中标识符属性是可选的,不过有很多原因来说明你应该使用标识符属性。我们建议标识符应该是“人造”的(自动生成,不涉及业务含义)。
使用自然键(natural keys)标识
对所有的实体都标识出自然键,用<natural-id>进行映射。实现equals()和hashCode(),在其中用组成自然键的属性进行比较。
为每个持久类写一个映射文件
不要把所有的持久类映射都写到一个大文件中。把 com.eg.Foo 映射到com/eg/Foo.hbm.xml中, 在团队开发环境中,这一点显得特别有意义。
把映射文件作为资源加载
把映射文件和他们的映射类放在一起进行部署。
考虑把查询字符串放在程序外面
如果你的查询中调用了非ANSI标准的SQL函数,那么这条实践经验对你适用。把查询字符串放在映射文件中可以让程序具有更好的可移植性。
使用绑定变量
就像在JDBC编程中一样,应该总是用占位符"?"来替换非常量值,不要在查询中用字符串值来构造非常量值!更好的办法是在查询中使用命名参数。
不要自己来管理JDBC connections
Hibernate允许应用程序自己来管理JDBC connections,但是应该作为最后没有办法的办法。如果你不能使用Hibernate内建的connections providers,那么考虑实现自己来实现org.hibernate.connection.ConnectionProvider
考虑使用用户自定义类型(custom type)
假设你有一个Java类型,来自某些类库,需要被持久化,但是该类没有提供映射操作需要的存取方法。那么你应该考虑实现org.hibernate.UserType接口。这种办法使程序代码写起来更加自如,不再需要考虑类与Hibernate type之间的相互转换。
在性能瓶颈的地方使用硬编码的JDBC
在系统中对性能要求很严格的一些部分,某些操作也许直接使用JDBC会更好。但是请先确认这的确是一个瓶颈,并且不要想当然认为JDBC一定会更快。如果确实需要直接使用JDBC,那么最好打开一个 Hibernate Session 然后从 Session获得connection,按照这种办法你仍然可以使用同样的transaction策略和底层的connection provider。
理解Session清洗( flushing)
Session会不时的向数据库同步持久化状态,如果这种操作进行的过于频繁,性能会受到一定的影响。有时候你可以通过禁止自动flushing,尽量最小化非必要的flushing操作,或者更进一步,在一个特定的transaction中改变查询和其它操作的顺序。
在三层结构中,考虑使用托管对象(detached object)
当使用一个servlet / session bean 类型的架构的时候, 你可以把已加载的持久对象在session bean层和servlet / JSP 层之间来回传递。使用新的session来为每个请求服务,使用 Session.merge() 或者Session.saveOrUpdate()来与数据库同步。
在两层结构中,考虑使用长持久上下文(long persistence contexts).
为了得到最佳的可伸缩性,数据库事务(Database Transaction)应该尽可能的
短。但是,程序常常需要实现长时间运行的“应用程序事务(Application
Transaction)”,包含一个从用户的观点来看的原子操作。这个应用程序事务
可能跨越多次从用户请求到得到反馈的循环。用脱管对象(与session脱离的对
象)来实现应用程序事务是常见的。或者,尤其在两层结构中,把Hibernate
Session从JDBC连接中脱离开,下次需要用的时候再连接上。绝不要把一个
Session用在多个应用程序事务(Application Transaction)中,否则你的数据
可能会过期失效。
不要把异常看成可恢复的
这一点甚至比“最佳实践”还要重要,这是“必备常识”。当异常发生的时
候,必须要回滚 Transaction ,关闭Session。如果你不这样做的话,
Hibernate无法保证内存状态精确的反应持久状态。尤其不要使用
Session.load()来判断一个给定标识符的对象实例在数据库中是否存在,应该
使用Session.get()或者进行一次查询.
对于关联优先考虑lazy fetching
谨慎的使用主动抓取(eager fetching)。对于关联来说,若其目标是无法在第二级缓存中完全缓存所有实例的类,应该使用代理(proxies)与/或具有延迟加载属性的集合(lazy collections)。若目标是可以被缓存的,尤其是缓存的命中率非常高的情况下,应该使用lazy="false",明确的禁止掉eager fetching。如果那些特殊的确实适合使用join fetch 的场合,请在查询中使用left join fetch。
使用open session in view模式,或者执行严格的装配期(assembly phase)策略来避免再次抓取数据带来的问题
Hibernate让开发者们摆脱了繁琐的Data Transfer Objects (DTO)。在传统的EJB结构中,DTO有双重作用:首先,他们解决了entity bean无法序列化的问题;其次,他们隐含地定义了一个装配期,在此期间,所有在view层需要用到的数据,都被抓取、集中到了DTO中,然后控制才被装到表示层。Hibernate终结了第一个作用。然而,除非你做好了在整个渲染过程中都维护一个打开的持久化上下文(session)的准备,你仍然需要一个装配期(想象一下,你的业务方法与你的表示层有严格的契约,数据总是被放置到托管对象中)。这并非是Hibernate的限制!这是实现安全的事务化数据访问的基本需求。
考虑把Hibernate代码从业务逻辑代码中抽象出来
把Hibernate的数据存取代码隐藏到接口(interface)的后面,组合使用DAO和Thread Local Session模式。通过Hibernate的UserType,你甚至可以用硬编码的JDBC来持久化那些本该被Hibernate持久化的类。 (该建议更适用于规模足够大应用软件中,对于那些只有5张表的应用程序并不适合。)不要用怪异的连接映射
多对多连接用得好的例子实际上相当少见。大多数时候你在“连接表”中需要保存额外的信息。这种情况下,用两个指向中介类的一对多的连接比较好。实际上,我们认为绝大多数的连接是一对多和多对一的,你应该谨慎使用其它连接风格,用之前问自己一句,是否真的必须这么做。
偏爱双向关联
单向关联更加难于查询。在大型应用中,几乎所有的关联必须在查询中可以双向导航。
分享到:
相关推荐
Struts2、Spring、Hibernate 高效开发的最佳实践
**Hibernate** 是一款非常流行的 **Java** 持久层框架,它提供了面向对象的方式来操作数据库记录,使得开发人员能够更加专注于业务逻辑而非底层的 SQL 代码。在 **Hibernate4** 中,关系映射是一个重要的概念,它...
只是一份非常珍贵的hibernatePPT教程。从第一个hibernate的简介到hibernate的完全实践都非常详细,按照课件一步步的操作。你就可以快速掌握真正的企业级hibernate开发实践。是非常珍贵的学习资料
本文将基于黑马程序员2016年的培训资料,对Hibernate的核心概念、配置、使用方法以及最佳实践进行深入探讨。 一、Hibernate框架基础 1.1 ORM概述:ORM是Object-Relational Mapping的缩写,它提供了一种将面向对象...
- 性能优化:提供一些最佳实践,如批处理操作、延迟加载、结果集转换等,以提升Hibernate应用的性能。 通过这四天的学习,你将对Hibernate有深入的理解,能够熟练地运用它来构建Java Web应用的数据访问层,大大提高...
这份手册深入浅出地讲解了Hibernate的核心概念、配置、使用方法以及最佳实践。 1. **Hibernate简介**:Hibernate是一种持久化框架,它通过映射Java类到数据库表,使得开发者可以避免编写大量的SQL语句,专注于业务...
此外,书中可能还会涵盖最佳实践、性能优化以及异常处理等方面的知识,帮助读者在实际项目开发中更好地运用这些技术。 总之,《轻量级Java EE企业应用实战(第4版)》是一本针对Java EE开发者的实用指南,通过深入...
《Hibernate 开发文档详解》 ...通过阅读和实践,开发者不仅可以学习到如何使用Hibernate进行数据库操作,还能了解到ORM框架的设计思想和最佳实践,从而在实际项目中更好地利用Hibernate提升开发效率和应用质量。
通过跟随夏昕老师的讲解,读者不仅可以掌握Hibernate的基本原理和操作方法,还能学到许多高级技术和最佳实践,为成为专业级的Java开发人员奠定坚实的基础。无论是初学者还是有一定经验的开发者,都能从中获得宝贵的...
SpringMVC、Spring4和Hibernate4是Java Web开发中的三个核心框架,它们分别负责不同的职责:SpringMVC作为模型-视图-控制器架构的一部分,处理Web应用的请求和响应;Spring4提供依赖注入和面向切面编程,管理应用的...
《深入浅出学Hibernate4开发》系列精品教程详细介绍了上述概念和最佳实践,提供了从基础到高级的技术内容,旨在帮助Java开发者高效地学习Hibernate框架,并将其应用于实际项目中。这些教程不仅关注技术细节,同时也...
《Hibernate ORM》是由李晓军等作者编著的书籍,主要涵盖了使用Hibernate进行对象关系映射(ORM)的最佳实践。Hibernate作为Java领域广泛使用的ORM框架,它极大地简化了数据库操作,将面向对象的编程思想与关系型...
源码是学习和理解书中理论的最佳实践材料,而这里提供的“完整版”源码,据描述,包含了书中几乎所有的示例代码,除了光盘中的软件之外。 首先,我们来看看压缩包内的各个文件夹: 1. **tools**:这个文件夹可能...
《Hibernate 3.5与Spring 2.5.5整合的最佳实践》 在现代Java企业级应用开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,与Spring框架的结合使用是常见的做法。本篇将深入探讨如何将Hibernate 3.5与Spring...
Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们各自在...通过阅读和实践这个实例,开发者不仅可以理解三大框架的基本用法,还能掌握实际开发中的最佳实践,为构建高质量的Java Web应用打下坚实的基础。
3. **开发手册**:开发手册是深入理解Hibernate工作原理和最佳实践的重要资源。它涵盖了配置、实体映射、事务管理、缓存策略、查询语言等方面,帮助开发者了解如何设置项目、如何设计数据模型以及如何优化性能。 4....
### 最佳实践 #### 零配置 随着技术的发展,Hibernate 支持基于注解的配置方式,减少了 XML 配置文件的使用,使得配置更加简洁高效。 以上是根据给定文件中提及的知识点进行的详细展开,希望这些内容能够帮助你更...
在这个“Hibernate开发lib包”中,包含的两个主要部分是“Hibernate 3.3 Annotations & Entity Manager”和“Hibernate 3.3 Core Libraries”,它们对于理解Hibernate的核心功能和使用方式至关重要。 1. **...
5. **最佳实践**:在实际开发中,应遵循一些最佳实践以优化使用Hibernate的项目。例如,合理设计实体类和数据库表的关系,避免过多的关联导致的性能下降;适当地使用懒加载和立即加载策略,以平衡内存占用和查询效率...