2011-01-09 143 views
3

我正在努力與Hibernate(數據庫端第一次)和一些如何擊中選擇使用saveOrUpdate或Save.Update 最佳可能的方式我有一個目標POJO類和它的其他屬性需要與Destination實體一起更新。 我正在獲取要導入的XML文件,並且正在使用以下代碼更新/保存目標實體及其屬性類。休眠saveorUpdate方法問題

try{ 
     getSessionFactory().getCurrentSession().beginTransaction(); 
     getSessionFactory().getCurrentSession().saveOrUpdate(entity); 
     getSessionFactory().getCurrentSession().getTransaction().commit(); 
     } 
     catch(Exception e){ 
      getSessionFactory().getCurrentSession().getTransaction().rollback(); 
     } 
     finally{ 
      getSessionFactory().close(); 
     } 

一切工作正常,直到我感到instance.but使用同一個會話後來當我使用相同的XML文件以更新某些屬性它給我下面的錯誤目的地PO。

SEVERE: Duplicate entry 'MNLI' for key 'DESTINATIONID' 
9 Jan, 2011 4:58:11 PM org.hibernate.event.def.AbstractFlushingEventListener performExecutions 
SEVERE: Could not synchronize database state with session 
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) 
    at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114) 
    at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109) 
    at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2242) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2678) 
    at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:79) 

我使用UUID作爲目標表和目標表我有一個目的ID是unique.but我可以理解,在secodn情況下休眠主鍵是不是能找到,如果已經有數據庫中相同目標的條目,並試圖執行插入語句而不是更新。

一個可能的解決方案是我可以用戶destinationid檢查是否已經有一個目的地與給定的ID和根據結果我可以發出保存或更新命令。 我的問題是,這可以通過任何其他好方法實現..?

在此先感謝saveOrUpdate()操作

+0

nt有會話getSessionFactory()。getCurrentSession()在一個變量中的任何原因? – Baz1nga 2011-01-09 12:59:37

+0

你在做一個session.Save()? – Baz1nga 2011-01-09 13:01:07

回答

2

語義如下(見11.7. Automatic state detection):

  • 如果對象是已持續在這個會議上,什麼也不做
  • 如果另一個對象相關聯與會話具有相同的標識符,拋出異常
  • 如果對象沒有標識符屬性,則save()它
  • 如果對象的標識符具有賦值給新實例化對象的值,則save()它
  • 如果對象由org版本化,並且version屬性值是分配給新實例化對象的相同值,則save ()是
  • 否則update()這個對象

所以,它看起來像主鍵或版本值導入XML文件的過程中丟失。