2013-01-22 54 views
3

這裏是我的代碼:的EntityManager拋出OptimisticLockException時,試圖刪除鎖定實體同一事務



EntityManager em = JPAUtil.createEntityManager(); 

    try { 

    EntityTransaction tx = em.getTransaction(); 

    try { 

      //do some stuff here 
      tx.begin(); 
      List es = em.createNamedQuery("getMyEntities", MyEntity.class).getResultList(); 

      for (MyEntity e : es) { 
       em.lock(e, LockModeType.OPTIMISTIC); 
      } 

      if (es.size() != 0) { 

       em.remove(es.get(0)); 

      } 

     tx.commit 

    } finally { 

     if (tx.isActive()) { 
      tx.rollback(); 
     } 

    } 

    } finally { 

     em.close(); 

    } 

當我執行的代碼,我得到:

...


.......... 
Caused by: javax.persistence.OptimisticLockException: Newer version [null] of entity [[MyEntity#63]] found in database 
    at org.hibernate.ejb.AbstractEntityManagerImpl.wrapLockException(AbstractEntityManagerImpl.java:1427) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1324) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1300) 
    at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:80) 
    ... 23 more 

有人可以解釋我爲什麼嗎?

+0

這種異常是否不斷髮生? – Taky

+0

@Taky是的。每次我嘗試刪除一個鎖定的實體。 – artaxerxe

+0

你能顯示getMyEntities命名查詢嗎? – Taky

回答

1

我想你已經添加了@Version -annotated列你已經有了一些條目的數據庫後,使一些空值對於已經存在的記錄的創建。 現在hibernate無法比較版本。

我會嘗試爲所有null版本實體設置版本列爲1。

1

我想這個錯誤是由於我試圖刪除一個有鎖的記錄的事實而引發的。試圖刪除該行,將版本設置爲null,但數據庫中的版本仍保持設置爲原來的編號。看起來,hibernate核心認爲這種操作對於不可靠的值來說是不可靠的。

如果我必須做這種操作,我必須首先釋放此實體上的鎖。

任何人都有更好的知識必須澄清這個問題。

相關問題