3

これが私のコードです:



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

誰かが私にその理由を説明できますか?

4

2 に答える 2

1

ロックされているレコードを削除しようとすると、このエラーがスローされると思います。この行を削除しようとすると、バージョンが にnull設定されますが、データベース内のバージョンは以前の番号に設定されたままです。休止状態のコアはnull、この種の操作に対して信頼できない値を認識しているようです。

この種の操作を行う必要がある場合は、まずこのエンティティのロックを解除する必要があります。

それについてより良い知識を持っている人は誰でもその問題を明確にする必要があります.

于 2013-09-10T05:45:36.087 に答える
1

@Versionデータベースにすでにいくつかのエントリがあった後に -annotated 列を追加したため、既存のレコードに対していくつかの null 値が作成されたと思います。現在、休止状態はバージョンを比較できません。

null バージョン管理されたすべてのエンティティに対して、バージョン列を 1 に設定しようとします。

于 2013-09-09T13:47:54.160 に答える