在通用的Spring CRUD DAO中获取正确的Hibernate模板

时间:2009-09-16 06:57:58

标签: java hibernate spring templates crud

我还是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

2 个答案:

答案 0 :(得分:4)

对于很多人来说,HibernateTemplateHibernateDaoSupport都在出局,而是首选注入SessionFactory。不是每个人,请注意,但这是我不久前采用的一种趋势,从我自己的通用DAO中移除HibernateTemplate

This blog有一个很好的总结。

作者的例子应该能够帮助你达到你想要的目标。

答案 1 :(得分:1)

GenericDao

好吧,对我来说,如果你的GenericDAO是'通用的',那么你可能只需要一个实例,并且只对该单个实例做所有事情。

我确信它不会打扰你接通实例,重复的是你生气(我同意你的意见)。

例如,您可以将Entity类传递给泛型方法

  • public void save(Class,E ...):允许您保存一个或多个E类型的实例,E是您的实体之一。
  • 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) {
        //....
      }
    }

接线

连接所有豆子并不是致命的。如今,有许多自动装配策略,您不必担心它。在春天看到他们 http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config