1

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 コードを再利用する場合に限られます。

永続化ユニットに依存しない解決策は何ですか (存在する場合)?

4

3 に答える 3

3

こんにちは、セッターメソッドを使用できます。

@Stateless
@Remote(MyEBean.class)
public class MyEBean extends FormEBean implements MyEBeanRemote {

    final Logger logger = LoggerFactory.getLogger(MyEBean.class);

    @PersistenceContext(unitName = "siat-ejbPU")
    @Override
    public void setEmCrud(EntityManager em) {
        super.setEmCrud(em)
    }

私のために働いた。

于 2012-12-14T14:19:40.870 に答える
0

CRUDメソッドを汎用にする必要があります(create / edit / remove)。

FormEBeanという名前のクラスはジェネリックであってはなりませ

クラスの代わりにメソッドをジェネリックにすると、一度実装すれば、任意のエンティティクラスで使用できます。一般的なクラッドメソッドは次のようになります。

public <T> T create(T someEntity) {
    em.persist(someEntity);
    return someEntity;
}

public <T> void create(Collection<T> entities) {
    for (T entity : entities) {
        em.persist(entity);
    }
}

public <T> void edit(T entity) {
    em.merge(entity);
}

public <T> void edit(Collection<T> entities) {
    for (T currentEntity : entities) {
        em.merge(currentEntity);
    }
}

それらをセッションBeanに入れ、どこでも使用して任意のエンティティを操作します。

/**
 *  Example managed bean that uses our
 *  stateless session bean's generic CRUD
 *  methods.
 *
 */

class ExampleManagedBean {

    @EJB
    MyCrudBeanLocal crudBean;

    public void createStuff() {
        // create two test objects
        Customer cust   =  createRandomCustomer();
        FunkyItem item  =  createRandomItem();
        // use generic method to persist them
        crudBean.create(cust);
        crudBean.create(item);
    }
}

この回答は、私が説明したことを正確に実行し、サンプルコードを提供します。

もう一つの例:

于 2012-08-24T22:44:43.163 に答える
0

問題を解決する解決策を見つけました。

これはjahroyの回答に基づいていますが、継承を使用して複数の永続ユニットを処理します。

共通コードは基本クラスです (ジェネリックではなく、ジェネリック メソッドを使用):

    public class FormEBean {

        final Logger logger = LoggerFactory.getLogger(FormEBean.class);

        protected EntityManager emCrud;

        public EntityManager getEmCrud() {
            return emCrud;
        }

        public void setEmCrud(EntityManager em) {
            emCrud = em;
        }

        public <T> String create(T entity) {
            String exception = null;
            try {
                emCrud.persist(entity);
                emCrud.flush();
            } catch (Exception ex) {
                //ex.printStackTrace();
                exception = ex.getLocalizedMessage();
            }
            return exception;
        }

        public <T> void create(List<T> entityList) {
            for (T entity : entityList) {
                emCrud.persist(entity);
            }
        }

        public <T> void edit(T entity) {
            emCrud.merge(entity);
        }

        public <T> void edit(Set<T> entitySet) {
            Iterator<T> it = entitySet.iterator();
            while (it.hasNext()) {
                T entity = it.next();
                emCrud.merge(entity);
                emCrud.flush();
            }
        }

        public <T> void remove(T entity) {
            emCrud.remove(emCrud.merge(entity));
        }

        public <T> void remove(T[] listaDaRimuovere) {
            for (T entity : listaDaRimuovere) {
                emCrud.remove(emCrud.merge(entity));
            }
        }

        public <T> void remove(List<T> listaDaRimuovere) {
            for (T entity : listaDaRimuovere) {
                emCrud.remove(emCrud.merge(entity));
            }
        }
     }

...そしてこれはインターフェースです:

public interface FormEBeanRemote {
    public void setEmCrud(EntityManager em);
    public <T> String create(T entity);
    public <T> void create(List<T> entityList);
    public <T> void edit(T entity);
    public <T> void edit(Set<T> entitySet);
    public <T> void remove(T entity);
    public <T> void remove(T[] listaDaRimuovere);
    public <T> void remove(List<T> listaDaRimuovere);
}

EJB (ステートレス セッション Bean) は次のようになります。

@Stateless
@Remote(MyEBean.class)
public class MyEBean extends FormEBean implements MyEBeanRemote {

    final Logger logger = LoggerFactory.getLogger(MyEBean.class);

    @PersistenceContext(unitName = "siat-ejbPU")
    private EntityManager em;

    public EntityManager getEm() {
        return em;
    }

    public void setEm(EntityManager em) {
        this.em = em;
    }

    @PostConstruct
    public void postConstruct() {
        this.setEmCrud(em);
    }

...どこ

@Remote
public interface MyEBeanRemote extends FormEBeanRemote {
......
}

EJB は postConstruct メソッドを使用して entityManager を設定することに注意してください。entityManager は、特定の持続性ユニットで CRUD 操作を実行するよう委任されています。

これまでのところ、魅力のように機能しています。

誰かが落とし穴を見つけたら、私に知らせてください。

于 2012-08-29T16:55:11.193 に答える