`
forchenyun
  • 浏览: 312674 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Hibernate最佳实践

    博客分类:
  • Java
阅读更多
设计细颗粒度的持久类并且使用<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
In performance-critical areas of the system, some kinds of operations might benefit from direct JDBC. But please, wait until you know something is a bottleneck. And don't assume that direct JDBC is necessarily faster. If you need to use direct JDBC, it might be worth opening a Hibernate Session and using that JDBC connection. That way you can still use the same transaction strategy and underlying connection provider. 在系统中对性能要求很严格的一些部分,某些操作也许直接使用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张表的应用程序并不适合。)

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

偏爱双向关联
单向关联更加难于查询。在大型应用中,几乎所有的关联必须在查询中可以双向导航。
分享到:
评论

相关推荐

    Hibernate4(事务,原理,性能和二级缓存,最佳实践).pdf

    #### 四、性能优化与最佳实践 **性能优化**: - **使用二级缓存**:Hibernate 提供了一级缓存(默认开启)和二级缓存。合理利用二级缓存可以极大地提高应用性能。 - **优化查询**:编写高效的 HQL 或 JPQL 查询,...

    hibernate的最佳实践,是你学习hibernate的最佳教程

    只是一份非常珍贵的hibernatePPT教程。从第一个hibernate的简介到hibernate的完全实践都非常详细,按照课件一步步的操作。你就可以快速掌握真正的企业级hibernate开发实践。是非常珍贵的学习资料

    hibernate培训ppt

    六、Hibernate最佳实践 在实际开发中,遵循一些最佳实践可以提高效率和代码质量,例如: - 使用缓存机制提高性能。 - 避免在查询中使用集合,以减少内存消耗。 - 使用批处理更新和插入操作提升批量处理的速度。 - ...

    Hibernate3 学习笔记.ppt

    【七、Hibernate最佳实践】 在使用Hibernate时,应注意以下最佳实践: 1. 合理设计实体类,避免过多的一对多关系。 2. 使用懒加载以提高性能。 3. 使用事务管理,确保数据一致性。 4. 避免在循环中执行查询,可能...

    Hibernate PDf

    ### Hibernate最佳实践 - **合理使用缓存**:根据应用场景选择合适的缓存策略,既可以提高性能又能够避免数据不一致的问题。 - **减少N+1问题**:通过FetchType.EAGER或FetchType.LAZY等方式来避免查询效率低下。 -...

    hibernate学习幻灯片

    **六、Hibernate最佳实践** 在实际项目中,应遵循一些最佳实践,比如合理设计持久化类,避免过多的懒加载以减少N+1查询问题,使用二级缓存提升性能,以及正确处理事务以保证数据一致性。 综上所述,Hibernate通过O/...

    hibernate培训教程.pptx

    六、Hibernate最佳实践 在实际开发中,应遵循一些最佳实践,例如合理设计持久化类,避免N+1查询问题,使用缓存提高性能,以及适当地配置事务和级联操作。了解并应用这些最佳实践能够提高代码的效率和可维护性。 ...

    hibernate帮助的相关文档

    此外,"Hibernate最佳实践"文档则是经验的结晶,涵盖了在实际项目中应遵循的规则和技巧,旨在帮助开发者避免常见陷阱,提高代码质量。 最后,"Hibernate与JPA比较"文档会帮助你理解Hibernate与Java Persistence API...

    Hibernate培训ppt

    **六、Hibernate最佳实践** 在实际使用中,应遵循一些最佳实践,如合理设计持久化类,避免N+1查询问题,使用缓存提高性能,以及适当地优化查询。同时,注意不要过度依赖Hibernate,有时候直接使用SQL可能是更优的...

    Hibernate培训

    一、持久化层-O/R Mapping 二、Hibernate入门 三、Hibernate映射申明(Mapping declaration) 四、持久化对象的状态和生命周期 五、Hibernate查询 六、Hibernate最佳实践

    hibernate培训

    9. **Hibernate最佳实践**: - 使用事务管理确保数据的一致性。 - 适当使用缓存以提高性能。 - 注意懒加载和立即加载的使用时机,避免N+1查询问题。 - 谨慎使用级联操作,防止数据冗余和意外修改。 通过...

    hibernate培训PPT

    **六、Hibernate最佳实践** 在实际开发中,遵循最佳实践可以优化性能和提高代码质量。例如,使用二级缓存提高数据访问速度,合理设计实体关系以减少N+1查询问题,使用批处理操作提高数据库交互效率,以及正确处理...

    hibernate教程

    Hibernate最佳实践 - 使用注解进行对象-关系映射,减少XML配置。 - 适当地使用缓存,提高数据读取效率。 - 合理设计实体类,避免大数据类型的直接映射。 - 在事务中执行数据库操作,保证数据一致性。 - 使用预编译...

    Hibernate教程

    6. **Hibernate最佳实践** - **合理设计实体关系**:避免过多的一对多关系,防止N+1查询问题。 - **使用缓存策略**:根据应用需求选择合适的缓存配置。 - **优化查询**:避免过于复杂的HQL,考虑使用原生SQL查询...

    hibernate ppt

    六、Hibernate最佳实践 1. 使用注解简化配置:尽可能使用注解来代替XML映射文件,提高代码可读性和维护性。 2. 优化懒加载(Lazy Loading):避免“懒加载地狱”,合理设计实体关联的加载策略。 3. 使用第一级缓存和...

    hibernate入门PPT

    六、Hibernate最佳实践 在实际开发中,应遵循一些最佳实践,如合理使用缓存、优化查询、避免N+1查询问题、事务管理等,以提高性能和可维护性。Hibernate还支持二级缓存和查询缓存,可以进一步提升应用程序的效率。 ...

    HibernateORM

    《Hibernate ORM》是由李晓军等作者编著的书籍,主要涵盖了使用Hibernate进行对象关系映射(ORM)的最佳实践。Hibernate作为Java领域广泛使用的ORM框架,它极大地简化了数据库操作,将面向对象的编程思想与关系型...

    Hibernate 培训.pdf

    #### 十一、Hibernate 最佳实践 - **概述**:遵循一定的最佳实践有助于提高开发效率和代码质量。 - **实践建议**: - 使用 HQL 或 Criteria API 进行查询。 - 合理设计实体类结构。 - 适当使用懒加载和 Eager ...

Global site tag (gtag.js) - Google Analytics