いつ
- ステートレス サービスを介してデータベースからエンティティをフェッチします。
- 次に、別の Bean でそれを変更し、
- 次に、ステートレス サービスを介してデータベースに保存します。
エンティティが切り離されていることに気付きました。ステートレス サービスの永続化コンテキストにより、エンティティが押収されて存在するようになったと思います。しかし、ステートフル サービスを使用する必要があるでしょうか。
保存するときに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);
}
}