未保存的瞬态实例Hibernate

时间:2014-10-12 10:05:01

标签: excel hibernate apache-poi one-to-many

虽然有几个与此异常相关的问题,但是,这不是一个可能重复的问题。使用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 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工作表,一切正常。

1 个答案:

答案 0 :(得分:2)

在下面的代码中,您正在为Foreigclass&amp;创建对象。 Baseclass并尝试只保存一个:

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处于Transient状态,因此当您调用session.save(obj2)时,它会检查链接的实体并在将obj2设置为持久状态之前进行状态。由于obj仍然处于“暂态”状态,因此会报错:

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

我想CepTransportBaseclass相同。

要解决此问题,请在保存Baseclass之前保存Foreigclass,如下所示:

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

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