编写细粒度的类并通过<component>标签做映射。
使用Adress类涵盖street,suburb,state,postcode属性。这样有利于代码重用并能够简化重构。
在持久类中声明identifier属性。
Hibernate中identifier属性是可选的,但是有很多理由要求我们使用他们。我们推荐使用“合成”主键(即使用自动生成,没有任何业务含义的字段)。
确定自然主键。
为所有的实例确定自然主键,并将他们映射到<natural-id>标签。实现equals()和hashCode()方法时比较组成自然主键的属性。
将每个类的映射放在自己的文件里。
不要使用单一的映射文件。com.eg.Foo类的映射放在com/eg/Foo.hbm.xml文件里。这样做在团队开发环境中尤其明智。
将映射文件作为资源加载。
将映射文件与他们所映射的类部署在一起。
考虑外部查询字符。
如果你调用了非ANSI标准的SQL函数时这是一个很好的实现。将外部查询字符放在映射文件里能够使你的应用更加方便。
使用约束变量。
就像在JDBC中一样,用“?”代替非常量。不要在查询中使用字符串拼接来约束变量的值!如果想做的更好,可以考虑在查询中使用命名的参数。
不要管理自己JDBC连接。
Hibernate由应用管理JDBC连接。这一做法应视为最后手段。如果你不能使用内置的连接,可以考虑自己实现org.hibernate.connection.ConnectionProvider类。
考虑使用自定义类型。
假设你有一个Java类型,比如库中的类,它需要被持久化但是不能提供作为组件的映射访问。你可以考虑实现org.hibernate.UserType。这个方法可以让你在自己实现的代码和Hibernate类型中自由转换。
在瓶颈点手工编写JDBC代码。
在系统性能的关键点,很多操作直接用JDBC可能更有效。但是请在你明确知道的瓶颈点使用JDBC,并且不要以为直接使用JDBC必然更快。如果你直接使用JDBC,那么打开一个Hibernate的Session连接用它的JDBC连接是值得的。这样,你仍可以应用相同的事务策略和底层连接供应商。
了解Session类的刷新。
Session不定时的与数据库同步持久类的状态。如果这个过程发生的太频繁可能影响实现。你有时可能需要通过禁用自动刷新来减少不必要的刷新,甚至需要在特定交易中改变查询和其他操作的顺序。
在三层架构中考虑使用超类。