0

次のエンティティがスローされ、削除時にエラーが発生します。

実在物:

@Entity
@NamedQueries({
})
public class Server {
   //some attributes
}

次の操作を実行する非常に単純なJUnitテストを実行します。

  1. エンティティサーバーが作成されます
    @Transactional
    パブリッククラスServerDao{
    public Server update(Server entity、long userId){
        entity.setDeleted(false);
        if(entity.getId()> 0){
            if(userId> 0){
                entity.setUpdated(new Date());
                entity.setUpdatedby(usersDao.get(userId));
            }
            em.merge(entity);
        } そうしないと {
            if(userId> 0){
                entity.setInserted(new Date());
                entity.setInsertedby(usersDao.get(userId));
            }
            em.persist(entity);
        }
        返品エンティティ;
        }
    }
    
  2. エンティティサーバーが削除されます

    ...同じダオ

    public void deleteHardJUnit(Server entity){
        em.remove(entity);
    }
    

    これにより、次のような例外がスローされます。

org.apache.openjpa.persistence.ArgumentException:デタッチされたオブジェクト「org.apache.openmeetings.persistence.beans.basic.Server-1」に対して操作deleteを実行できません。

削除方法を次のように変更した場合:

public void deleteHardJUnit(Server entity) {
    if (entity.getId() > 0) {
        em.refresh(entity);
        em.remove(entity);
    }
}

すべてが期待どおりに機能しているように見えます。例外はスローされず、レコードはデータベースから削除されます。

ただし、これが何を意味するのかわかりません。削除する前に、すべてのエンティティを本当に更新する必要がありますか?原因エンティティを更新する必要なしに、EntityManager.deleteを何度も使用しています。

4

1 に答える 1

1

Springのアノテーションを使用していると仮定すると@Transactional、アノテーションが付けられたオブジェクトのインスタンス内からの呼び出しをインターセプトすることはできません(SpringがAOPおよびメソッドインターセプトに動的プロキシを使用しているため)。サービスレイヤーから呼び出して、そこでメソッドにアノテーションを付けてみてください。

Springを使用していない場合@TransactionAttributeは、類似のJavaEEアノテーションであるを使用することをお勧めします。

于 2013-02-02T03:52:46.753 に答える