虽然有几个与此异常相关的问题,但是,这不是一个可能重复的问题。使用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工作表,一切正常。
答案 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);
因此,最初obj2
和obj
处于Transient状态,因此当您调用session.save(obj2)
时,它会检查链接的实体并在将obj2
设置为持久状态之前进行状态。由于obj
仍然处于“暂态”状态,因此会报错:
org.hibernate.TransientObjectException: object references an unsaved transient instance
- save the transient instance before flushing: model.CepTransport.
我想CepTransport
与Baseclass
相同。
要解决此问题,请在保存Baseclass
之前保存Foreigclass
,如下所示:
session.save(obj);
session.save(obj2);
但是如果您想使用CASCADE设置,请检查Foreigclass
处的设置,并确保CASCADE值正确。