2

いつ

  1. ステートレス サービスを介してデータベースからエンティティをフェッチします。
  2. 次に、別の Bean でそれを変更し、
  3. 次に、ステートレス サービスを介してデータベースに保存します。

エンティティが切り離されていることに気付きました。ステートレス サービスの永続化コンテキストにより、エンティティが押収されて存在するようになったと思います。しかし、ステートフル サービスを使用する必要があるでしょうか。
保存するときにEntityManager#find(ClassOfDetachedEntity,PrimaryKeyOfDetachedEntity)、データベース内のエンティティへの参照を取得し、切り離されたエンティティをそれに割り当てます。
しかし、これは方法ですか?
以前は、既存のエントリを変更したかっただけでしたが、コピーをデータベースに永続化するだけでした。

更新 (「切り離された」問題が発生する場所を示す簡単な例):

@Stateless
@Log
public class DatabaseService implements Serializable {

    @PersistenceContext
    EntityManager em;

    public List<Category> getCategories() {
        return em.createQuery("SELECT c FROM Category c").getResultList();
    }

    public void checkIfDetached(Object o){
        log.info("is detached: " + String.valueOf(!em.contains(o)));
    }
}  

Bean のログステートメントは、オブジェクトが切り離されていることを教えてくれます。

 @ManagedBean
    @ViewScoped
    public class CategoriesBean implements Serializable {
        private Category testCategory;

        @PostConstruct
        public void init(){
            testCategory = dbs.getCategories().get(0);
            dbs.checkIfDetached(testCategory);
        }
    }
4

3 に答える 3

1

分離されたエンティティは大した問題ではありません。簡単に元に戻すことができます。実際、 EJB 3 in Actionの講義から覚えているのであれば、JPA は、エンティティーができるだけ短時間でアタッチされるように設計されています。

エンティティに対して JPA 操作を実行する前に、単にエンティティをマージ(再度アタッチ) します。

em.merge(entity);
于 2013-10-01T11:45:04.717 に答える