前の質問であるDAOおよびサービスレイヤー(JPA / Hibernate + Spring)に続いて、JPA / Hibernate、Spring、およびWicketを使用するアプリケーションでは、データレイヤーに(少なくとも最初は)単一のDAOのみを使用することにしました。一般的なCRUDメソッドの使用が提案されましたが、JPAを使用してこれを実装する方法がよくわかりません。例を教えてください、またはこれに関するリンクを共有してください。
5 に答える
インターフェースの例を次に示します。
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
か?いいえ。EntityManagerのラッパーになるだけの不要なdaoクラスがあります。EntityManager(または休止状態のセッション)を使用して、サービスクラスにselectを書き込むことを恐れないでください。
もう1つの注意:サービスレイヤーの境界を定義し、プログラマーがエンティティクラスに戻ったり待機したりしないようにする必要があります。UIまたはWSレイヤーのプログラマーは、DTOについてのみエンティティクラスについてまったく知らないはずです。エンティティオブジェクトには、ほとんどのプログラマーが知らないライフサイクルがあります。エンティティオブジェクトをセッションデータに保存し、数秒または数時間後にデータベースに更新しようとすると、非常に深刻な問題が発生します。そうしないかもしれませんが、サービスレイヤーのパラメータータイプとリターンタイプを知っているUIのプログラマーは、コードの数行を節約するためだけに行うでしょう。
私はこれと同じものを探していました。まさにそのように見えるもの、つまりSpringSourceが提供するSpring- DataJPAプロジェクトを見つけました。これはHadesのコードポートであり、現在(2011年初頭)Springに飲み込まれ、より適切に統合されています。これにより、静的な作成で単一のdao(SimpleJpaRepository)を使用したり、基本のJpaRepositoryクラスを拡張して、既製のCRUD+メソッドでオブジェクト固有のdaoを作成したりできます。また、インターフェイスでメソッドの名前としてparams名を使用するだけでクエリのようなグレイルを許可します(実装は必要ありません!)。つまりfindByLastname(String lastName);
、非常に有望に見えます。Springプロジェクトに参加することで、将来も確実になります。私は今、これを次のプロジェクトに実装し始めました。
サードパーティの実装を探している場合は、 http://www.altuure.com/projects/yagdao/を確認できます。これは、JPAとHibernateをサポートする注釈ベースの汎用DAOフレームワークです。
http://codeblock.engio.net/data-persistence-and-the-dao-pattern/もご覧ください。
関連するコードはgithubhttps ://github.com/bennidi/daoismにあります
Springと統合されており、HibernateとEclipseLinkの構成例があります