在Hibernate3官方文档中有关于Hibernate的最佳实践,并且对二级缓冲等也作了介绍,这些很多朋友可能已经知道或者关注,我这里分享的主要是一些官方文档或者网上相对讨论比较少的经验。
1、对属性配置项中的update和insert的需要注意,该两项都默认是true,也就是在持久对象时的insert和update sql会包含所有的字段,如果我们开启Hibernate sql日志,就会明显看到这个问题。其实我们往往在update的时候只更新部分数据,有些数据根本不会发生在update阶段。例如createDate之类的内容。所以在配置持久对象的时候我们更多要关注那些字段update需要设置成false。其实比较了解ORM的朋友这是基本注意问题。
2、通常希望用Hibernate mapping file来维护数据库ddl的朋友,常常忽略的内容:
2.1 length 如果是varchar类型,最好设置length。
2.2 foreign-key 如果在具有外键引用的地方不设置该项,Hibernate tools将会自动生成一个很不便于维护的constraint名称。主要在<many-to-one>中体现。
2.3 可以通过指定index来对一个或多个属性索引。
2.4 ID生成策略上我们常常遇到无法跨数据库的问题,我这里有个特殊写法能帮助解决如下问题:
2.5 hibernate schema update无法实现对索引和Constraint的更新。请注意这点。特别是重命名的话基本无法删除原来的。
今天在重构一个项目代码的时候发现这些问题,希望有参考价值。
1、对属性配置项中的update和insert的需要注意,该两项都默认是true,也就是在持久对象时的insert和update sql会包含所有的字段,如果我们开启Hibernate sql日志,就会明显看到这个问题。其实我们往往在update的时候只更新部分数据,有些数据根本不会发生在update阶段。例如createDate之类的内容。所以在配置持久对象的时候我们更多要关注那些字段update需要设置成false。其实比较了解ORM的朋友这是基本注意问题。
<property name="crateTime" type="timestamp" column="create_time" update="false"/>
2、通常希望用Hibernate mapping file来维护数据库ddl的朋友,常常忽略的内容:
2.1 length 如果是varchar类型,最好设置length。
2.2 foreign-key 如果在具有外键引用的地方不设置该项,Hibernate tools将会自动生成一个很不便于维护的constraint名称。主要在<many-to-one>中体现。
2.3 可以通过指定index来对一个或多个属性索引。
2.4 ID生成策略上我们常常遇到无法跨数据库的问题,我这里有个特殊写法能帮助解决如下问题:
<id name="id" column="id" type="long">
<generator class="native">
<param name="sequence">LMS_S_XX_ID</param>
</generator>
</id>
2.5 hibernate schema update无法实现对索引和Constraint的更新。请注意这点。特别是重命名的话基本无法删除原来的。
今天在重构一个项目代码的时候发现这些问题,希望有参考价值。