このユースケースを実装する最良の方法は何ですか?長い会話のためのJavaEE EntityManager
イメージトップビジネスプロセスの呼び出し元の一種であるEJB A
があります。それは他の豆を呼び出します。他のBeanの呼び出し中に例外が発生した場合は、A
によって行われたすべてをロールバックします。
A
beanにEntityManagerを一度挿入して、それを他のBeanに渡すことをイメージします。それは良い習慣と考えられていますか?
このユースケースを実装する最良の方法は何ですか?長い会話のためのJavaEE EntityManager
イメージトップビジネスプロセスの呼び出し元の一種であるEJB A
があります。それは他の豆を呼び出します。他のBeanの呼び出し中に例外が発生した場合は、A
によって行われたすべてをロールバックします。
A
beanにEntityManagerを一度挿入して、それを他のBeanに渡すことをイメージします。それは良い習慣と考えられていますか?
https://docs.oracle.com/cd/E16439_01/doc.1013/e13981/servtran002.htmに記載されているようにコンテナ管理トランザクションを使用してください。
あなたのA Beanクラスに以下の注釈を入れて:@TransactionManagement(値= TransactionManagementType.CONTAINER)
そして、他のBeanを呼び出すことで法上の次の注釈:@TransactionAttribute(値= REQUIRED)
そして、トランザクションをロールバックするために他のBeanが例外をスローするようにしてください。
これは単なる使用例ですが、EJBトランザクション管理を読むことを強くお勧めします。
例:先端FOT
@Stateless
public static class A{
@PersistenceContext(unitName="a")
private EntityManager em = null;
@Inject
private B b = null;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void doInTransaction(){
//get some data from em
//modify and save back to b
b.save(data);
}
}
public static class B{
@PersistenceContext(unitName="a")
private EntityManager em = null;
public void save(data){
//save against em
//catch JPA exception and throw back as RuntimeException
}
}
感謝。私はすでにトランザクション管理について何かを読んでいます。トランザクション管理を使用すると正しく理解できれば、エンティティマネージャのインジェクションはコントローラによって制御されますか?したがって、私が 'A'に豆を注入した場合と同様に、' A'でトランザクション管理を指定し、エンティティマネージャーをこの他のbeanに注入すると、注入は 'A' beanのトランザクション管理によって制御されます。私は正しい? –
EntityManagerの注入は、トランザクションではなくEJBコンテナによって制御されます。 Aが使用している他のBeanにEntityManagerを渡す必要はありません。それらは、 "new"キーワードを使用してこれらのBeanをコード内に手動で作成していない限り、コンテナによってEntityManagerが挿入される必要があります。 – tsolakp