EJB に CRUD メソッドを装備したいと考えています。
多くのエンティティと複数の永続ユニットがあります。
CRUD メソッドを一度実装して、別の永続化ユニットで呼び出したいと考えています。
継承を使用してこれを達成しようとしましたが、機能していません。
CRUD クラスは次のとおりです。
public class FormEBean<T> {
protected EntityManager em;
public EntityManager getEm() {
return em;
}
public void setEm(EntityManager em) {
this.em = em;
}
public String create(T entity) {
try {
em.persist(entity);
em.flush();
return null;
} catch (Exception ex) {
return ex.getLocalizedMessage();
}
}
public void create(List<T> entityList) {
for (T entity : entityList) {
em.persist(entity);
}
}
public void edit(T entity) {
em.merge(entity);
}
public void edit(Set<T> entitySet) {
Iterator<T> it = entitySet.iterator();
while (it.hasNext()) {
T entity = it.next();
em.merge(entity);
}
}
public void remove(T entity) {
em.remove(em.merge(entity));
}
public void remove(T[] listaDaRimuovere) {
for (T entity : listaDaRimuovere) {
em.remove(em.merge(entity));
}
}
public void remove(List<T> listaDaRimuovere) {
for (T entity : listaDaRimuovere) {
em.remove(em.merge(entity));
}
}
}
だから私はこの方法で試しました:
@Stateless
@Remote(MyEBeanRemote.class)
public class MyEBean extends FormEBean<MyEntityClass> implements MyEBeanRemote {
@PersistenceContext(unitName = "siat-ejbPU")
private EntityManager em;
// code here
}
エラーが発生していなくても、CRUD 関数はデータベースに影響を与えません。
代わりに、それらを MyEBean に直接挿入すると、期待どおりに動作します。
@PersistenceContext(unitName = "siat-ejbPU")
EJB は異なる永続化ユニットを使用できるため、FormEBean では使用したくありません。
この問題を解決する方法はありますか?
コードを再利用するために使用できるパターンはありますか?
編集:
この質問の目的は、異なる EJB モジュールに属し、異なる永続ユニットを持つ EJB で CRUD コードの再利用を最大化するソリューションを見つけることです。
ステートレス セッション Bean でジェネリック メソッドを使用することは良い解決策のように思えますが、同じ持続性ユニットで EJB の CRUD コードを再利用する場合に限られます。
永続化ユニットに依存しない解決策は何ですか (存在する場合)?