2010-08-01 72 views
0

我是新來的休眠。我有一個事務,失敗與HibernateException,但表後更改提交。這裏是代碼:(休眠)表失敗後提交

public StoreResult store(Entry entry) 
{ 
    Session session = HibernateUtility.getSessionFactory().openSession(); 
    Transaction transaction = session.beginTransaction(); 

    try 
    {   
     String id; 

     if (entry.getStatus() == Entry.Status.PUBLISHED) 
     { 
      id = TitleToURLConverter.convert(entry.getTitle()); 
     } 
     else 
     { 
      id = "temp_"; 
     } 

     if (entry.getId() == null) 
     { 
      entry.setId(id); 
      session.save(entry); 
     } 
     else 
     { 
      session.update(entry); 

      session.createQuery("update Entry set id = :newId where id = :oldId") 
      .setString("newId", id) 
      .setString("oldId", entry.getId()) 
      .executeUpdate(); 

      session.refresh(entry); 
     } 

     transaction.commit(); 

     return StoreResult.SUCCESS; 
    } 
    catch (RuntimeException e) 
    { 
     transaction.rollback(); 
     if (e instanceof ConstraintViolationException) return StoreResult.DUPLICATE_ID; 

     throw e; 
    } 
    finally 
    { 
     session.close(); 
    } 
} 

編輯:顯然InnoDB不會回滾事務上的重複鍵錯誤,但只有語句。我希望事務始終回滾到任何錯誤。

編輯2:忽視這一點。我正在使用MyIsam。

+0

你得到的異常的細節是什麼? – 2010-08-01 02:11:40

+0

這是一個ConstraintViolationException,因爲表中存在重複的id。這意味着存在具有相同ID的條目。我想處理它並向用戶顯示這樣的消息。感謝您的答覆! transaction.wasCommited()返回false。 – 2010-08-01 02:18:45

+0

現在您已經可以工作了,請考慮將會話和事務實例創建置於使用語句中以正確處理。 – 2010-08-01 12:13:55

回答

1

從MyIsam切換到InnoDB解決了這個問題。