未保存的瞬态实例hibernate

虽然有几个问题与这个例外相关,但是这不是一个可能的重复。 使用APACHE POI遍历多个Excel表,我必须使用JPA来执行多对一的关系

for (int i = 0; i < wb.getNumberOfSheets(); i++) { HSSFSheet sheet = wb.getSheetAt(i); .... if(i=0) { Baseclass obj = new Baseclass (); obj.setname("name"); session.save(obj) session.getTransaction().commit(); } if(i=3) { Foreigclass obj2 = new Foreigclass (); obj2.setsection("2A"); Baseclass obj = new Baseclass (); --> obj2.setTransport(obj); // linking foreign keys // error comes here session.save(obj2) } 

在标记的行,我收到以下exception:

 Exception in thread "main" org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: model.CepTransport at org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:294) at org.hibernate.type.EntityType.getIdentifier(EntityType.java:537) at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:311) at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:321) at org.hibernate.type.TypeHelper.findDirty(TypeHelper.java:294) at org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:4243) at org.hibernate.event.internal.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:546) at org.hibernate.event.internal.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:232) 

有人可以提出这里有什么问题吗? CASCADing属性很好,如果数据只来自一个Excel工作表,那么一切正常。

在下面的代码中,您正在为ForeigclassBaseclass创build对象,并试图只保存一个:

 Foreigclass obj2 = new Foreigclass (); // Created Foreigclass object obj2.setsection("2A"); Baseclass obj = new Baseclass (); // Created Baseclass object obj2.setTransport(obj); // linking foreign keys // error comes here session.save(obj2); 

所以,最初obj2obj处于瞬态状态,所以当你调用session.save(obj2)它将在obj2处于Persistent状态之前检查链接的实体和那里的状态。 由于obj仍处于瞬态状态,因此错误的抱怨是:

 org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: model.CepTransport. 

这里我猜CepTransport是一样的。

要解决这个问题,在保存Baseclass之前保存你的Baseclass

 session.save(obj); session.save(obj2); 

但是,如果您想使用CASCADE设置,请检查Foreigclass的设置,并确保CASCADE值正确。