hibernate要点

2008-02-23 09:24:29来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

最近在研究Hibernate,在这里记录一些要点项,版主就54下吧。

转自飞茂的blog(网上搜索意外发现的,如果有版权问题,请pm我,我会删除)

1.两种配置文件: A.hibernate.cfg.XML 和 B.hibernate.properties

A中可含映射文件的配置,而B中hard codes加映射文件。

A。Configuration config=new Configuration().config(); B. Configuration config=new Configuration(); config.addClass(TUser.class);

2.你不必一定用hibernate.cfg.xml或hibernate.properties这两文件名, 你也不一定非得把配置文件放在Classes下, File file=new File("c:\\sample\\myhibernate.xml"); Configuration config=new Configuration().config(file);

3. session.Flush() 强制数据库立即同步,当用事务时,不必用flush,事务提交自动调用flush 在session关闭时也会调用flush

4. Hibernate总是使用对象类型作为字段类型

5. XDoclet专门建立了hibernate doclet,就是在Java代码上加上一些 java docTag,后来再让XDoclet分析该java代码,生成映射文件;

6.HQL子句本身大小写无关,但是其中出现的类名和属性名必须注意大小写区分。

7.关系: Constrained : 约束,表明主控表的主键上是否存在一个外键(foreigh key) 对其进行约束。

property-ref:关联类中用于与主控类相关联的属性名,默认为关联类的主键属性名

单向一对多需在一方配置,双向一对多需在双方进行配置

8.lazy=false:被动方的记录由hibernate负责记取,之后存放在主控方指定的 Collection类型属性中

9. java.util.Set或net.sof.hibernate.collecton.Bag类型的Collection

10.重要:inverse:用于标识双向关联中的被动方一端。 inverse=false的一方(主控方)负责维护关联关系.默认值:false

11.batch-size:采用延迟加载特征时,一次读入的数据数昨。

12.一对多通过主控方更新(主控方为一方时)

user.getAddresses().add(addr); session.save(user);//通过主控对象级联更新

13.在one-to-many 关系中,将many 一方设为主动方(inverse=false)将有助性能 的改善。在一方设置关系时,inverse=true,即将主控权交给多方, 这样多方可主动从一方获得foreign key,然后一次insert即可完工。

addr.setUser(user);//设置关联的TUser对象 user.getAddresses().add(addr); session.save(user);//级联更新

14.只有设为主控方的一方才关心(访问)对方的属性,被动方是不关心对方的属性的。

15.one-to-many与many-to-one节点的配置属性不同: 一对多关系多了lazy和inverse两个属性 多对多节点属性:column:中间映射表中,关联目标表的关联字段 class:类名,关联目标类 outer-join:是否使用外联接

注意:Access是设置属性值的读取方式。

column是设置关联字段。

16.多对多,注意两方都要设置inverse和lazy,cascade只能设为insert-update 多对多关系中,由于关联关系是两张表相互引用,因此在保存关系状态时必须对双方同时保存。

group1.getRoles().add(role1); role1.getGroups().add(group1);

session.save(role1); session.save(group1);

17.关于vo和po vo经过hibernate容量处理,就变成了po(该vo的引用将被容器保存,并且在session关闭时flush,因此po如果再传到其它地方改变了,就危险了) vo和po相互转换:BeanUtils.copyProperties(anotherUser,user);

18.对于save操作而言,如果对象已经与Session相关联(即已经被加入Session的实体容器中),则无需进行具体的操作。因为之后的Session.flush过程中,Hibernate 会对此实体容器中的对象进行遍历,查找出发生变化的实体,生成并执行相应的update 语句。

19.如果我们采用了延迟加载机制,但希望在一些情况下,实现非延迟加 载时的功能,也就是说,我们希望在Session关闭后,依然允许操作user的addresses 属性 Hibernate.initialize方法可以通过强制加载关联对象实现这一功能: 这也正是我们为什么在编写POJO时,必须用JDK Collection接口(如Set,Map), 而非特定的JDK Collection实现类(如HashSet、HashMap)申明Collection属性的 原因。

20.事务:从sessionFactory获得session,其自动提交属性就已经关闭(AutoCommit=false),此时若执行了JDBC操作,如果不显式调用session.BeginTransaction(),是不会执行事务操作的。

jdbc transaction:基于同一个session(就是同一个connection)的事务; jta transaction:跨session(跨connection)事务.

对于jta事务,有三种实现方法: A。UserTransaction tx=new InitialContext().lookup("..."); tx.commit(); B. 使用hibernate封装的方法:(不推荐) Transaction tx=session.beginTransaction(); tx.commit(); C. 使用EJB之sessionBean的事务技持方法,你只要在把需要在发布描述符中,把需要jta事务的方法声明为require即可

21.悲观锁,乐观锁: 乐观锁一般通过version来实现,注意version节点必须出现在id后。

22.Hibernate中,可以通过Criteria.setFirstResult和Criteria.setFetchSize方法设定分页范围。 Query接口中也提供了与其一致的方法,hibernate主要在dialect类中实现在这个功能。

23.cache <hibernate-configuration> <session-factory> …… <property name="hibernate.cache.provider_class"> net.sf.ehcache.hibernate.Provider </property>

还需对ecache本身进配置 <ehcache> <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="10000" //Cache中最大允许保存的数据数量 eternal="false" //Cache中数据是否为常量 timeToIdleSeconds="120" //缓存数据钝化时间 timeToLiveSeconds="120" //缓存数据的生存时间 overflowToDisk="true" //内存不足时,是否启用磁盘缓存 /> </ehcache>

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:基于tomcat5.5的数据库连接池环境设置(个人总结)

下一篇:SWT/JFace开发入门指南(十)