前の質問 DAOおよびサービスレイヤー(JPA/Hibernate + Spring) に続いて、JPA/Hibernateを使用するアプリケーションで(少なくとも最初は)データレイヤーに単一のDAOを使用することにしました、SpringおよびWicket。汎用CRUDメソッドの使用が提案されましたが、JPAを使用してこれを実装する方法はよくわかりません。例を挙げてください、またはこれに関するリンクを教えてください。
インターフェイスの例を次に示します。
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);
}
}
記事に基づいて DAOを繰り返さないでください この種の手法は長年使用されていました。大きな間違いを犯したことに気付いた後、私たちは常にパターンの問題に苦しんでいました。
HibernateやJPAなどのORMツールを使用すると、DAOとサービスレイヤーを別々に考える必要がなくなります。トランザクションのライフサイクルとエンティティクラスのロジックを知っているので、サービスクラスからEntityManagerを使用できます。
単にmyDao.saveEntity
の代わりにentityManager.saveEntity
を呼び出すと、時間を節約できますか?いいえ。不要なdaoクラスがありますが、これはEntityManagerのラッパーになります。 EntityManager(または休止状態のセッション)を使用して、サービスクラスに選択を記述することを恐れないでください。
もう1つの注意:サービスレイヤーの境界線を定義する必要があります。また、プログラマーがEntityクラスに戻ったり待機したりしないようにしてください。 UIまたはWS層のプログラマーは、DTO-sについてのみエンティティークラスについて知る必要はありません。エンティティオブジェクトには、ほとんどのプログラマが知らないライフサイクルがあります。エンティティオブジェクトをセッションデータに保存し、数秒または数時間後にデータベースに更新しようとすると、本当に深刻な問題が発生します。そうではないかもしれませんが、パラメーターの型を知っており、サービスレイヤーの型を返すUIのプログラマーは、数行のコードを保存するだけです。
私はこれと同じものを探していました。 SpringSourceが提供する Spring-Data JPAプロジェクトは、まさにそのように見えました。これは Hades からのコード移植版であり、現在(2011年前半)はSpringに飲み込まれ、より良く統合されています。静的作成で単一のdao(SimpleJpaRepository)を使用するか、ベースJpaRepositoryクラスを拡張して、既製のCRUD +メソッドでオブジェクト固有のdaoを作成できます。また、パラメータ名をメソッドの名前として使用するだけでクエリのようなグレイルを許可します-インターフェースで(実装は必要ありません!)すなわちfindByLastname(String lastName);
は非常に有望に見えます-Springプロジェクトの一部であることは確かに将来を保証しますも。私はこれを私の今後のプロジェクトで実装し始めました。
サードパーティの実装を探している場合は、 http://www.altuure.com/projects/yagdao/ を確認できます。これは、JPAと休止状態をサポートする表記法ベースの汎用DAOフレームワークです
http://codeblock.engio.net/data-persistence-and-the-dao-pattern/ もご覧ください
関連するコードはgithubにあります https://github.com/bennidi/daoism
Springとの統合と、HibernateおよびEclipseLinkの構成例があります。