2014-10-12 71 views
1

虽然有几个问题与此例外相关,但是,这不是可能的重复。通过多次迭代Excel中使用APACHE POI床单,我不得不使用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

这里的电子表格和Hibernate之间的连接是什么?您在电子表格中阅读,然后使用Hibernate持久化到RDBMS? – 2014-10-12 10:43:30

+0

是的,值从Excel中读取并保存到数据库,使用休眠 – Abhinav 2014-10-12 10:48:24

+0

好吧,FWIW你可以很容易地使用DataNucleus JPA从Excel中读取对象,这种方式不需要单独的API使用 – 2014-10-12 13:32:57

回答

2

在下面的代码要为Foreigclass & 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是瞬态的,所以当你调用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); 

但是,如果你想使用级联设定,然后在Foreigclass检查设置,确保级联值是否正确。

+0

你可以进一步解释,什么你的意思是“在保存Foreigclass之前保存你的Baseclass”......以及如何做到这一点? – Abhinav 2014-10-12 10:50:27

+0

@Abhinav,更新了我的回答,请检查。 – Chaitanya 2014-10-12 10:56:58

+0

谢谢Chaitanya,这个删除了错误。谢谢。但是现在你看到外部类正在实例化基类方法并向其中插入空行! – Abhinav 2014-10-12 11:10:29

相关问题