7

データベース内のレコードを維持するための CRUD 操作を実行することを唯一の目的とするアプリケーションを作成しています。一部のテーブル/エンティティ間に関係があります。セッション Bean を作成するために私が見たほとんどの例は、私が持っていない多くのエンティティとやり取りする複雑なビジネス ロジック/操作を扱っています。

私のアプリケーションは非常に基本的なものなので、セッション Bean の最適な設計は何でしょうか?

メソッドが定義された CRUD を持つエンティティごとに 1 つのセッション Bean を持つことを考えていました。次に、これらすべてのセッション Bean を 1 つのセッション Bean に結合することを考えました。そして、興味をそそるこのブログ エントリを見つけましたが、すべてを理解していないことを認めなければなりません (ServiceFacade とは何ですか?)。

私はセッション Bean/エンティティ クラスに傾倒していますが、より経験豊富な意見を聞きたいです。

ありがとう。


おっと、ここにブログのリンクがあります: http://www.adam-bien.com/roller/abien/entry/generic_crud_service_aka_dao

4

1 に答える 1

11

あなたが話しているブログエントリがわからない:)しかし、あなたの特定の状況1では、おそらく次のようなインターフェースを実装する単一のセッションBeanを使用します。

public interface GenericCrudService {
    public <T> T create(T t);
    public <T> T find(Class<T> type, Object id);
    public <T> void delete(T t);
    public <T> T update(T t);
    public List findWithNamedQuery(String queryName);
    public List findWithNamedQuery(String queryName, int resultLimit);
    public List findWithNamedQuery(String namedQueryName, 
                                   Map<String, Object> parameters);
    public List findWithNamedQuery(String namedQueryName, 
                                   Map<String, Object> parameters,
                                   int resultLimit);
    public <T> List<T> findWithNativeQuery(String sql, Class<T> type);
}

Bean は次のようになります。

@Stateless
@Remote(GenericCrudService.class)
@TransactionAttribute(TransactionAttributeType.MANDATORY)
public class GenericCrudServiceBean implements GenericCrudService {
    @PersistenceContext
    private EntityManager em;

    @Override
    public <T> T create(T t) {
        em.persist(t);
        return t;
    }

    @Override
    public <T> T find(Class<T> type, Object id) {
        return em.find(type, id);
    }

    @Override
    public <T> void delete(T t) {
        t = em.merge(t);
        em.remove(t);
    }

    @Override
    public <T> T update(T t) {
        return em.merge(t);
    }

    @Override
    public List findWithNamedQuery(String queryName) {
        return em.createNamedQuery(queryName).getResultList();
    }

    @Override
    public List findWithNamedQuery(String queryName, int resultLimit) {
        return em.createNamedQuery(queryName).setMaxResults(resultLimit)
                .getResultList();
    }

    @Override
    public List findWithNamedQuery(String namedQueryName,
                                   Map<String, Object> parameters) {
        return findWithNamedQuery(namedQueryName, parameters, 0);          
    }

    @Override
    public List findWithNamedQuery(String namedQueryName,
                                   Map<String, Object> parameters,
                                   int resultLimit) {
        Query query = this.em.createNamedQuery(namedQueryName);
        if(resultLimit > 0) {
            query.setMaxResults(resultLimit);            
        }
        for (Map.Entry<String, Object> entry : parameters.entrySet()) {
            query.setParameter(entry.getKey(), entry.getValue());
        }
        return query.getResultList();
    }

    @Override
    @SuppressWarnings("unchecked")
    public <T>  List<T> findWithNativeQuery(String sql, Class<T> type) {
        return em.createNativeQuery(sql, type).getResultList();
    }
}

こちらもご覧ください

1ほとんどのアプリケーションは、生の CRUD をクライアントに直接公開するべきではありませんが、ビジネス ルールを実装し、ドメイン ストアへのアクセスをカプセル化するサービスの背後で CRUD を保護する必要があります ( EntityManager.

于 2010-05-31T23:17:48.760 に答える