Hibernate 备忘知识点

来源:互联网 发布:好听的网络名字女生 编辑:程序博客网 时间:2024/05/15 01:20

转自:《JAVA EE 实用开发指南(基于Weblogic+EJB3+Struts2+Hibernate+Spring)》 作者:高洪岩

1)不可手动修改OID,因为将造成缓存中的数据不准确。

2)Session接口中的update方法是将一个游离对象转变成持久对象的方案。

3)对于Session接口中的saveOrUpdate()方法,如果参数传入的是瞬时对象就执行save,如果传入的是游离对象,就执行update。

4)Session接口中的load和get方法都具有查询数据的功能。区别是,当数据库中不存在指定的OID数据时,load方法报异常,而get方法返回空,get方法在主从表关系上取得从表的数据永远立即检索数据库。load方法在主从表关系上取得从表的数据永远返回代理类。

5)执行完一个save操作之后,最好使用session.flush()方法进行缓存与数据库的同步。经常出现的问题就是新建一条记录,然后立即执行list.action时找不到刚才的记录,主要原因就是缓存的数据没有和数据库的同步。如果在执行save操作之后根本不需要访问再访问这个对象,也就没有必要执行flush()方法。

6)Hibernate3.1默认是延迟加载,延迟加载(lazy)的意义主要体现在主从表上,如主贴与回帖。当使用延迟加载时,在根据一个主贴OID取得主贴信息时,并不会自动取得与这个主贴相关联的回帖。延迟加载的反方法为立即加载,如果使用立即加载,那么根据一个OID取得主贴的同事会把数据库中回帖的数据记录也异同查询出来,这样就损失性能,所以要根据实际情况和数据量的大小来设置lazy的值是TRUE或FALSE。可以在set一端进行lazy的设置,如配置文件。

7)如果正在使用延迟加载,并且在action中已经将session.close()关闭,那么JSP中取得List中的子表数据会提示出错:Exception sinitializing proxy-Could not initialize proxy -the owning Session was closed。解决办法是哎session.close之后,将List中的对象使用方法Hibernate.initialize(代理对象参数)对List中的代理类进行实例化。或者使用Open Session In View的设计模式 来达到目的。Hibernate 中代理类的概念即只有一个OID属性的类,所以使用延迟加载时,List中的字表数据都是代理类,在List中取得时就会出错,所以要使用Hibernate.initialize(代理对象参数)方法进行代理类的实例化,最后需要注意的是导入类import org.hibernate.Hibernate。

8)延迟加载只对load方法有效,对get方法是无效的,因此get方法永远不会生成映射类的代理。

9)对于多对一或一对一关联,应该优先采用外连接检索策略,这样比立即检索策略使用的SQL语句更少。

10)使用Hibernate的ORM技术需要根据实际情况,对于超大数据量的软件项目,不要为了Hibernate而Hibernate。

原创粉丝点击