一般的なSpring CRUD DAOで正しいHibernateテンプレートを取得する
質問
私はまだSpringが初めてなので、これらすべてのCRUD DAOを作成するのがいらいらすることがわかったため、「パブリッククラスGenericCRUDDAOはHibernateDaoSupportがCRUDDAOを実装するように拡張します」を作成しました。私のサービスオブジェクトでは、次のように言うだけです
private GenericCRUDDAO<User, Integer> userDAO = new GenericCRUDDAO<User, Integer>();
これ以上、単純なDAOを作成して接続する必要はありません。わーい! 1つのことを除いて、Springの経験豊富な開発者ならすぐにわかると思います。GenericCRUDDAO内でHibernateテンプレートを取得できないので、
HibernateTemplate ht = getHibernateTemplate();
nullのhtを提供します。あまり良くない。配線することを考えました。つまり、genericCRUDDAO Beanを作成し、静的なAnnotationSessionFactoryBeanを設定しますが、それでもHibernateTemplateが得られません。 Hibernateテンプレートを使用できるようにするための回避策についての提案はありますか?
一般的なCRUD DAOの作成に関するその他の問題について検討する必要がありますか?
乾杯
Nik
解決
多くの場合、 HibernateTemplate
と HibernateDaoSupport
はアウトにあり、代わりに SessionFactory
を挿入することが推奨されます。みんなではありませんが、それはトレンドであり、私があまり採用していないので、自分の汎用DAOから HibernateTemplate
を削除しています。
このブログにはかなり良い要約があります。
著者の例は、あなたが行きたい場所に到達するのに役立つはずです。
他のヒント
GenericDao
まあ、 GenericDAOが「generic」の場合、必要なインスタンスは1つだけです、その単一のインスタンスですべてを実行します。
インスタンスにワイヤリングすることは気にしないと思いますが、あなたが怒るのは繰り返しです(そしてあなたに同意します)。
たとえば、 Entityクラスをジェネリックメソッドに渡すことができます。
- public void save(Class、E ...):Eタイプの1つ以上のインスタンスを保存できます。Eはエンティティの1つです。
- public E load(Class、Long id):エンティティをロードします。
-
...
/** Assuming the entities have a superclass SuperEntity with getIdent(). */ public class GenericDaoImpl implements GenericDao { /** Save a bunch of entities */ public void save(SuperEntity... entities) { for(SuperEntity entity : entities) { getSession().save(entity); } } /** Load any entity. */ public <E extends SuperEntity> E load(Class<E> entityClass, Long ident) { return (E)getSession().load(entityClass, ident); } // other generic methods }
バリアント
アプリケーションには、実際にこのためのバリアントがあります。各Daoには多くの特定の要求があるため、とにかく特定のDaoクラスが必要です(クラスを作成して配線します)。定義されないDaoの特殊なケースを避けるために、特定のDaoクラスをすぐに作成します。
コーディング
ただし、コードを繰り返すことはありません。 DaosはすべてGenericDaoを拡張し、コンストラクターで必要なClassパラメーターを提供します。サンプルコード(完全ではなく、基本的な考え方を簡単に理解できます):
public abstract class GenericDaoImpl<E extends SuperEntity>
implements GenericDao<E> {
/** Available for generic methods, so it is not a parameter
* for the generic methods. */
private final Class<E> entityClass;
protected GenericDaoImpl(Class<E> entityClass) {
this.entityClass = entityClass;
}
// generic implementation ; can be made efficient, as it may
// send the orders as a batch
public void save(E... entities) {
for(SuperEntity entity : entities) {
getSession().save(entityClass, entity.getIdent());
}
// possibly add flushing, clearing them from the Session ...
}
// other generic methods
}
public class PersonDaoImpl extends GenericDaoImpl<Person>
implements PersonDao {
/** Constructor, instanciating the superclass with the class parameter. */
public PersonDaoImpl() {
super(Person.class);
}
/** Specific method. */
public List<Person> findByAge(int minAge, int maxAge) {
//....
}
}
配線
すべてのBeanの配線は致命的ではありません。現在、多くの自動配線ポリシーがありますが、心配する必要はありません。春にそれらを見る
http://static.springsource。 org / spring / docs / 2.5.x / reference / beans.html#beans-annotation-config