JBoss 7を使用するSeam 3サンドボックスアプリケーション、デフォルトJPA実装としてHibernate、WebフロントエンドとしてJSFとして使用しています。JPA/HibernateはEJB/Seam環境でコミット時にUPDATEを発行しません
私は、SQL UPDATEがデフォルトでは飲み込まれるという問題があります。対話スコープで
私のステートフルEJBは、拡張がEntityManagerの一つのエンティティは、コンテナ管理のトランザクションは、EntityManagerのは、EJBエンティティをロードするためにEMを使用し続ける
- (新しい必要です)スコープを維持しますその場で
- JSFアプリケーションはEJBとそのエンティティにアクセスし、文字列フィールドを変更
- JSFアプリケーションは、EJB に「保存」方法をcalles
- でsave()エンティティフィールドが変更されているかどうかチェックします。>正しく変更された場合
- save()が完了した後、コンテナはトランザクションをコミットします。
- 問題:DBに対してSQL更新が実行されません。
iを)(保存拡張する場合:
予想通りA)entityManager.contains(エンティティ)はUPDATEが実行される(結果が "真" である)
OR
B) entityManager.persist(entity)UPDATEが期待どおりに実行される
Q:エンティティがプロセス全体で管理されているため、仕様の理解が必要な場合は、a)またはb)のどちらも必須ではありません。 私は理解しません、なぜa)節約に影響します。 私はイメージングすることができますb)節約に効果がありますが、それは必須ではありませんか?
説明を歓迎します。ここで
は私のEJBです:
@Named
@ConversationScoped
@Stateful
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public class LanguageBean {
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager em;
@Inject
private UserTransaction transaction;
private Language value;
@Inject
Conversation conversation;
public LanguageBean() {
super();
}
@Begin
public void selectLanguage(Long anId) {
conversation.setTimeout(10 * 60 * 1000);
if (anId != null) {
value = em.find(Language.class, anId);
}
}
@BeforeCompletion
public void transactionComplete(){
System.out.println("transactionComplete");
}
public Language getValue() {
return value;
}
@Produces
@Named
@ConversationScoped
public Language getLanguage() {
return getValue();
}
public void setValue(Language aValue) {
value = aValue;
}
@End
public String save() {
// displays the changed attribute:
System.out.println("save code: "+value.getCode());
// why is either this required:
// boolean tempContains = em.contains(value);
// System.out.println("managed: "+tempContains);
// or: why is persist required:
em.persist(value);
return "languages?faces-redirect=true";
}
@End
public String cancel() throws SystemException {
transaction.setRollbackOnly();
return "languages?faces-redirect=true";
}
}
私はentityManager.flushを発見()も問題を解決します。しかし、なぜこれが必要と思われるのか分かりません。 JPAの仕様から: "JTAトランザクションがコミットするとき、プロバイダはすべての変更されたエンティティ状態を データベースにフラッシュする必要があります。" – user1187037
多分、休止状態のセッションのFlushModeがnoneに設定されているかもしれませんか? – Firo