2014-10-12 58 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

相關問題