Hibernate 常见异常

1.错误异常:

Java代码  

  1. org.hibernate.InstantiationException: No default constructor for entity: com.tks.skyproject.model.ImplementLogAttach  

  2. at org.hibernate.tuple.PojoInstantiator.instantiate(PojoInstantiator.java:90)  

  3. at org.hibernate.tuple.PojoInstantiator.instantiate(PojoInstantiator.java:106)  

  4. at org.hibernate.tuple.AbstractEntityTuplizer.instantiate(AbstractEntityTuplizer.java:344)  

  5. at org.hibernate.persister.entity.AbstractEntityPersister.instantiate(AbstractEntityPersister.java:3272)  

  6. at org.hibernate.impl.SessionImpl.instantiate(SessionImpl.java:1239)  

  7. at org.hibernate.impl.SessionImpl.instantiate(SessionImpl.java:1228)  

  8. at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1291)  

  9. at org.hibernate.loader.Loader.getRow(Loader.java:1197)  

 错误分析:构造函数出了问题 到类里一看 默认构造函数被删了
错误解决:到类里写上无参构造方法。

 

为什么要加无参数的构造方法?

原因:当查询的时候返回的实体类是一个对象实例,是hibernate动态通过反射生成的,反射的Class.forName("className").newInstance();需要对应的类提供一个无参构造函数

 

2.错误异常:

Java代码  

  1. org.hibernate.HibernateException: identifier of an instance of com.org.model.MyClass was altered from 7 to 1  

  2.     at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:85)  

  3.     at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:190)  

  4.     at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:147)  

  5.     at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219)  

 原因:如果我们从数据库load/get一个对象出来,虽然对它没调用update方法,但是在提交事务时候,hibernate仍要把当前对象和session中对象做比较,一旦修改了该对象某个属性,hibernate会自动执行更新操作的。导致缓存中的id和数据库中的id不一致。所以报错。

在Hibernate中是不允许修改主键的。

你可能感兴趣的:(Hibernate)