我还是Spring的新手,我发现它让所有这些CRUD DAO变得恼人,所以我做了一个“公共类GenericCRUDDAO扩展HibernateDaoSupport实现CRUDDAO”。在我的服务对象中,我只需说出像
这样的内容private GenericCRUDDAO<User, Integer> userDAO = new GenericCRUDDAO<User, Integer>();
我不再需要编写简单的DAO并将它们连接起来。好极了!除了一件事,我确信你所有经验丰富的Spring开发人员都会马上看到:我无法在GenericCRUDDAO中获得Hibernate模板,所以这样做
HibernateTemplate ht = getHibernateTemplate();
给了我一个空的ht。不太好。我想连接它,意味着制作一个genericCRUDDAO bean然后设置一个静态AnnotationSessionFactoryBean,但仍然不会给我一个HibernateTemplate。关于我如何解决这个问题的任何建议,以便我可以使用我的Hibernate模板?
制作通用CRUD DAO还有什么问题我应该考虑一下?
干杯
的Nik
答案 0 :(得分:4)
对于很多人来说,HibernateTemplate
和HibernateDaoSupport
都在出局,而是首选注入SessionFactory
。不是每个人,请注意,但这是我不久前采用的一种趋势,从我自己的通用DAO中移除HibernateTemplate
。
This blog有一个很好的总结。
作者的例子应该能够帮助你达到你想要的目标。
答案 1 :(得分:1)
好吧,对我来说,如果你的GenericDAO是'通用的',那么你可能只需要一个实例,并且只对该单个实例做所有事情。
我确信它不会打扰你接通实例,重复的是你生气(我同意你的意见)。
例如,您可以将Entity类传递给泛型方法。
...
/** 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) {
//....
}
}
连接所有豆子并不是致命的。如今,有许多自动装配策略,您不必担心它。在春天看到他们 http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config