-
2004-11-16
Hibernate的最佳实践(zz自Reference)
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://bpnrtech.blogbus.com/logs/499251.html
Hibernate的最佳实践(zz自Reference) 作者:malu
发表时间:
2004-04-20 12:11:29
更新时间:
2004-08-13 11:01:11
浏览:61次
主题:个人空间
评论:0篇
引用:0次
地址:166.111.29.4
:::栏目::: - 以下几条规则绝对是宝贵的经验总结
- 设计细颗粒度的持久类并且使用<component>来实现映射。
-
使用一个Address持久类来封装 street, suburb, state, postcode. 这将有利于代码重用和简化代码重构(refactoring)的工作。
- 对持久类声明标识符属性。
-
Hibernate中标识符属性是可选的,不过有很多原因来说明你应该使用标识符属性。我们建议标识符应该是“人造”的(自动生成,不涉及业务含义),并且不是基本类型。为了最大的灵活性,应该使用java.lang.Long or java.lang.String
- 为每个持久类写一个映射文件
-
不要把所有的持久类映射都写到一个大文件中。把 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. This approach frees the application code from implementing transformations to / from a Hibernate type. 假设你有一个Java类型,来自某些类库,需要被持久化,但是该类没有提供映射操作需要的存取方法。那么你应该考虑实现net.sf.hibernate.UserType接口。这种办法使程序代码写起来更加自如,不再需要考虑类与Hibernate type之间的相互转换。
- 在性能瓶颈的地方使用硬编码的JDBC
-
在对性能要求很严格的一些系统中,一些操作(例如批量更新和批量删除)也许直接使用JDBC会更好,但是请先搞清楚这是否是一个瓶颈,并且不要想当然认为JDBC一定会更快。如果确实需要直接使用JDBC,那么最好打开一个 Hibernate Session 然后从 Session获得connection,按照这种办法你仍然可以使用同样的transaction策略和底层的connection provider。
- 理解Session清洗( flushing)
-
Session会不时的向数据库同步持久化状态,如果这种操作进行的过于频繁,那么性能会受到一定的影响。有时候你可以通过禁止自动flushing尽量最小化非必要的flushing操作,或者更进一步,在一个特殊transaction中改变查询和其它操作的顺序。
- 在三层架构中,考虑使用 saveOrUpdate()
-
当使用一个servlet / session bean 的架构的时候, 你可以把已加载的持久对象在session bean层和servlet / JSP 层之间来回传递。使用新的session来为每个请求服务,使用 Session.update() 或者Session.saveOrUpdate()来更新对象的持久状态。
- 在两层架构中,考虑使用session disconnection.
-
当仅仅使用 servlet的时候,你可以在多个客户请求中复用同一个session,只是要记得在把控制权交还给客户端之前disconnect掉session。
- 不要把异常看成可恢复的
-
这一点甚至比“最佳实践”还要重要,这是“必备常识”。当异常发生的时候,回滚 Transaction ,关闭Session。如果你不这样做的话,Hibernate无法保证内存状态精确的反应持久状态。尤其不要使用Session.load()来判断一个给定标识符的对象实例在数据库中是否存在,应该使用find()。
- 对于关联优先考虑lazy fetching
-
谨慎的使用主动外连接抓取(eager (outer-join) fetching)。对于大多数没有JVM级别缓存的持久对象的关联,应该使用代理(proxies)或者具有延迟加载属性的集合(lazy collections)。对于被缓存的对象的关联,尤其是缓存的命中率非常高的情况下,应该使用outer-join="false",显式的禁止掉eager fetching。如果那些特殊的确实适合使用outer-join fetch 的场合,请在查询中使用left join。
- 考虑把Hibernate代码从业务逻辑代码中抽象出来
-
把Hibernate的数据存取代码隐藏到接口(interface)的后面,组合使用DAO和Thread Local Session模式。通过Hibernate的UserType,你甚至可以用硬编码的JDBC来持久化那些本该被Hibernate持久化的类。 (该建议更适用于规模足够大应用软件中,对于那些只有5张表的应用程序并不适合。)
历史上的今天:
域建模与用例建模:孰先孰后? 2004-11-16Business rules:在OptimalJ中的处理 2004-11-16关于Transaction Script、Domain Model模式讨论 2004-11-16cvs_eclipse配置笔记- - 2004-11-16ant+junit集成测试出现的一些问题总结- - 2004-11-16随机文章:
hibernate随笔 2004-11-16Hibernate的一些小心得 2004-11-16Hibernate的一些小心得 2004-11-16Hibern8IDE HQL Commander窗口的中文问题 2004-11-15在Eclipse 中调用 Hibern8IDE,同时解决中文问题 2004-11-15
收藏到:Del.icio.us
- 以下几条规则绝对是宝贵的经验总结







