web-dev-qa-db-ja.com

シングルDAOおよび汎用CRUDメソッド(JPA / Hibernate + Spring)

前の質問 DAOおよびサービスレイヤー(JPA/Hibernate + Spring) に続いて、JPA/Hibernateを使用するアプリケーションで(少なくとも最初は)データレイヤーに単一のDAOを使用することにしました、SpringおよびWicket。汎用CRUDメソッドの使用が提案されましたが、JPAを使用してこれを実装する方法はよくわかりません。例を挙げてください、またはこれに関するリンクを教えてください。

45
John Manak

インターフェイスの例を次に示します。

public interface GenericDao<T, PK extends Serializable> {
    T create(T t);
    T read(PK id);
    T update(T t);
    void delete(T t);
}

そして実装:

public class GenericDaoJpaImpl<T, PK extends Serializable> 
    implements GenericDao<T, PK> {

    protected Class<T> entityClass;

    @PersistenceContext
    protected EntityManager entityManager;

    public GenericDaoJpaImpl() {
        ParameterizedType genericSuperclass = (ParameterizedType) getClass()
             .getGenericSuperclass();
        this.entityClass = (Class<T>) genericSuperclass
             .getActualTypeArguments()[0];
    }

    @Override
    public T create(T t) {
        this.entityManager.persist(t);
        return t;
    }

    @Override
    public T read(PK id) {
        return this.entityManager.find(entityClass, id);
    }

    @Override
    public T update(T t) {
        return this.entityManager.merge(t);
    }

    @Override
    public void delete(T t) {
        t = this.entityManager.merge(t);
        this.entityManager.remove(t);
    }
}
86
Pascal Thivent

記事に基づいて DAOを繰り返さないでください この種の手法は長年使用されていました。大きな間違いを犯したことに気付いた後、私たちは常にパターンの問題に苦しんでいました。

HibernateやJPAなどのORMツールを使用すると、DAOとサービスレイヤーを別々に考える必要がなくなります。トランザクションのライフサイクルとエンティティクラスのロジックを知っているので、サービスクラスからEntityManagerを使用できます。

単にmyDao.saveEntityの代わりにentityManager.saveEntityを呼び出すと、時間を節約できますか?いいえ。不要なdaoクラスがありますが、これはEntityManagerのラッパーになります。 EntityManager(または休止状態のセッション)を使用して、サービスクラスに選択を記述することを恐れないでください。

もう1つの注意:サービスレイヤーの境界線を定義する必要があります。また、プログラマーがEntityクラスに戻ったり待機したりしないようにしてください。 UIまたはWS層のプログラマーは、DTO-sについてのみエンティティークラスについて知る必要はありません。エンティティオブジェクトには、ほとんどのプログラマが知らないライフサイクルがあります。エンティティオブジェクトをセッションデータに保存し、数秒または数時間後にデータベースに更新しようとすると、本当に深刻な問題が発生します。そうではないかもしれませんが、パラメーターの型を知っており、サービスレイヤーの型を返すUIのプログラマーは、数行のコードを保存するだけです。

14
Balazs Zsoldos

私はこれと同じものを探していました。 SpringSourceが提供する Spring-Data JPAプロジェクトは、まさにそのように見えました。これは Hades からのコード移植版であり、現在(2011年前半)はSpringに飲み込まれ、より良く統合されています。静的作成で単一のdao(SimpleJpaRepository)を使用するか、ベースJpaRepositoryクラスを拡張して、既製のCRUD +メソッドでオブジェクト固有のdaoを作成できます。また、パラメータ名をメソッドの名前として使用するだけでクエリのようなグレイルを許可します-インターフェースで(実装は必要ありません!)すなわちfindByLastname(String lastName);は非常に有望に見えます-Springプロジェクトの一部であることは確かに将来を保証しますも。私はこれを私の今後のプロジェクトで実装し始めました。

5
Danny C

サードパーティの実装を探している場合は、 http://www.altuure.com/projects/yagdao/ を確認できます。これは、JPAと休止状態をサポートする表記法ベースの汎用DAOフレームワークです

2
altuure

http://codeblock.engio.net/data-persistence-and-the-dao-pattern/ もご覧ください

関連するコードはgithubにあります https://github.com/bennidi/daoism

Springとの統合と、HibernateおよびEclipseLinkの構成例があります。

1
bennidi