hibernate错误解决方案(持续更新)

来源:互联网 发布:知柏地黄丸一次吃几粒 编辑:程序博客网 时间:2024/06/11 17:52

和上篇的spring错误解决方案一样,本篇要把开发中遇到的一些hibernate问题的解决方案记录下来,方便查阅:

1.org.hibernate.LazyInitializationException: could not initialize proxy - no Session

(1)这是一个hibernate懒加载所引起的懒加载问题,这也是一个比较经典的问题了,由于对象是懒加载的,当session关闭的时候就会遇到这个问题,在web开发中常常会遇到这个问题,比较经典的解决方案就是利用osiv模式,也就是在view层打开和关闭session,在jsp页面获取值时,session依然是存在的,在web.xml文件中配置一个filter就可以了

  <filter>  <filter-name>OpenSessionInViewFilter</filter-name>  <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>  </filter>  <filter-mapping>  <filter-name>OpenSessionInViewFilter</filter-name><url-pattern>*.action</url-pattern>    </filter-mapping>
注意:这个过滤器必须要在struts2的过滤器之前配置,如果在struts2的过滤器之后配置那么就不起作用了

还有一种解决方案就是在获取这懒加载对象是,调用相应的方法来获取值,比如Person是一个懒加载的对象,为了避免在jsp页面获取name时出现懒加载异常,那么可以在取得这个对象是用p.getName()来手动的获取下值,那么下次在获取值时,就不会出现这个问题了

2.java.lang.IllegalArgumentException: id to load is required for loading

为什么会遇到这个错误呢:通过get()或者load()方法通过id去查找对象时,传入的id为空,所有hibernate就会抛出这个异常。

解决方案:在web开发中常常需要通过客户端传递的id来查询某个javabean,所有在调用get()或者load()方法时就应该对id进行检查,只有在id不为空的情况下才能调用hibernate的方法去查询,否则进行相应的处理。

3.org.hibernate.MappingException: Unknown entity: cn.zq.domain.Person

由于没有在hibernate的配置文件中导入Person的映射文件,hibernate就不认识这个实体bean,解决方法就是在hibernate的配置文件中导入Person的映射文件。

4.org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: cn.zq.domain.Student
分析:从字面上的意思来分析就是:你保存了一个关联着一个未保存的对象。也就是说你保存的一个对象所关联的对象不是持久化对象。

解决方案:

(1)在保存这个对象之前,先保存这个关联对象

(2)在映射文件中,配置cascade属性,设置这个属性后就可以级联的保存students

<set name="students" cascade="save-update"><key><column name="cid"></column></key><one-to-many class="cn.zq.domain.Student"/></set>

5.org.hibernate.HibernateException: No CurrentSessionContext configured!

分析:由于在调用sessionFactory.getCurrentSession()时,没有在hibernate的配置文件中配置相应属性,所有hibernate从当前线程获取session时报错,所以加入以下配置就解决了

6.More than one row with the given identifier was found: 1, for class: cn.rz.domain.Student(更新时间2015-05-06 15:33)
分析:出现这个异常的原因:在调用session.get(cls, id)时得到了不止一条记录,也就是说在内存中有多个相同id的class,最后在数据库中发现,这个字段并不是在数据库中的id,所以通过这个字段获取到的记录不止一条。
建议,最后不要用在数据库中不是主键的字段作为hibernate的主键,这个字段要么是主键,要么是唯一且不能为空的字段。




0 0