`

Hibernate4实战最佳实践

 
阅读更多



设计细颗粒度的持久类并且使用<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张表的应用程序并不适合。)不要用怪异的连接映射
多对多连接用得好的例子实际上相当少见。大多数时候你在“连接表”中需要保存额外的信息。这种情况下,用两个指向中介类的一对多的连接比较好。实际上,我们认为绝大多数的连接是一对多和多对一的,你应该谨慎使用其它连接风格,用之前问自己一句,是否真的必须这么做。
偏爱双向关联
单向关联更加难于查询。在大型应用中,几乎所有的关联必须在查询中可以双向导航。
 
12
7
分享到:
评论

相关推荐

    hibernate实战 英文版

    ### Hibernate实战知识点解析 #### 一、书籍简介与评价概览 《Hibernate实战》是一部备受赞誉的关于Hibernate框架的专业书籍,被广泛认为是最权威的Hibernate著作之一。该书由Hibernate项目的核心开发者撰写,因此...

    Hibernate4实战 之第七部分

    ### Hibernate4实战之第七部分:最佳实践 #### 设计细颗粒度的持久类并使用`&lt;component&gt;`实现映射 在Hibernate中,细颗粒度的持久类是指将实体中的复杂属性拆分成单独的对象进行管理。例如,对于一个用户实体中的...

    Hibernate实战

    《Hibernate实战》这本书深入浅出地探讨了Java领域中广泛使用的对象关系映射...通过学习,读者不仅可以了解到Hibernate的工作原理,还能掌握实际开发中的最佳实践,从而更好地利用Hibernate提升开发效率和项目质量。

    Hibernate4实战(pdf_source).

    5. **最佳实践**:在实际开发中,应遵循一些最佳实践以优化使用Hibernate的项目。例如,合理设计实体类和数据库表的关系,避免过多的关联导致的性能下降;适当地使用懒加载和立即加载策略,以平衡内存占用和查询效率...

    Hibernate4实战

    最后,本书分享了一系列的最佳实践,旨在帮助开发者构建健壮、可维护的Hibernate应用程序。这些实践覆盖了代码组织、错误处理、性能调优等多个方面。此外,书中还提供了多个实际项目案例,通过这些案例,读者可以...

    Hibernate实战第二版

    针对Hibernate 4,感谢无私的奉献者,不要积分。...还深刻阐述了数据库设计、ORM和优化等方面的基本原则、策略和最佳实践。书中处处闪烁着作者超凡的真知灼见,将大大升华读者对ORM乃至企业级应用开发的理解。

    Hibernate开发实战源代码

    【Hibernate开发实战源代码】是针对Java开发人员的一个学习资源,特别关注于使用Hibernate这个流行的对象关系...通过深入研究这些代码,开发者可以逐步掌握Hibernate的核心功能和最佳实践,从而提升自己的开发技能。

    Manning.Java.Persistence.with.Hibernate[Hibernate实战第二版].pdf

    这本书的第二版由Hibernate的创始人Gavin King亲自撰写,针对Hibernate 3进行了全面的更新,以适应当时最新的技术和最佳实践。 Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者以面向对象的方式...

    Hibernate实战.pdf 第2版 中文完整版

    《Hibernate实战》(第2版)是毋庸置疑的Hibernate和ORM...还深刻阐述了数据库设计、ORM和优化等方面的基本原则、策略和最佳实践。书中处处闪烁着作者超凡的真知灼见,将大大升华读者对ORM乃至企业级应用开发的理解。

    hibernate实战第二版.pdf

    通过阅读《Hibernate实战》第二版,读者不仅可以掌握Hibernate的基本使用,还能了解到其高级特性和最佳实践,从而在实际开发中更加得心应手。这本书对于想要深入学习Java ORM的开发者来说,无疑是一份宝贵的资源。

    Hibernate实战(第2版).pdf

    《Hibernate实战(第2版)》是一本深入探讨Java持久化框架Hibernate的专业书籍,它针对的是Java开发人员,特别是那些希望提升数据库管理效率和优化应用程序性能的开发者。Hibernate作为一个开源的对象关系映射(ORM...

    Hibernate实战(第2版)

    《Hibernate实战》(第2版)详细讲述了Hibernate3.2、JavaPersistence和EJB3.0标准。《Hibernate实战》(第2版)通过一个应用将数百个例子融合起来...还深刻阐述了数据库设计、ORM和优化等方面的基本原则、策略和最佳实践。

    Hibernate实战(第2版) 高清扫描版

    通过阅读这本书,读者不仅能掌握Hibernate的基本使用,还能深入了解其高级特性和最佳实践,从而在实际项目中发挥出Hibernate的强大功能,提高开发效率,降低维护成本。《Hibernate实战(第2版)》高清扫描版提供了...

    Hibernate实战(第2版).zip

    《Hibernate实战(第2版)》是一本深入探讨Java领域持久化框架Hibernate的专业书籍,它为读者提供了详尽的Hibernate使用指南和最佳实践。在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化...

    轻量级Java EE企业应用实战(第4版) Struts 2+Spring 4+Hibernate整合开发 光盘 源码

    此外,书中可能还会涵盖最佳实践、性能优化以及异常处理等方面的知识,帮助读者在实际项目开发中更好地运用这些技术。 总之,《轻量级Java EE企业应用实战(第4版)》是一本针对Java EE开发者的实用指南,通过深入...

Global site tag (gtag.js) - Google Analytics