0

我对 Spring 还是很陌生,而且我发现制作所有这些 CRUD DAO 很烦人,所以我制作了一个“公共类 GenericCRUDDAO 扩展 HibernateDaoSupport 实现 CRUDDAO”。然后在我的服务对象中,我只是说类似

private GenericCRUDDAO<User, Integer> userDAO = new GenericCRUDDAO<User, Integer>();

我不再需要编写简单的 DAO 并将它们连接起来。耶!除了一件事,我确信所有经验丰富的 Spring 开发人员都会立即看到:我无法在 GenericCRUDDAO 中获取 Hibernate 模板,所以这样做

HibernateTemplate ht = getHibernateTemplate();

给了我一个空的 ht。不太好。我想把它连接起来,意思是制作一个通用的CRUDDAO bean,然后设置一个静态的AnnotationSessionFactoryBean,但这仍然不会给我一个HibernateTemplate。关于如何解决这个问题以便我可以拥有我的 Hibernate 模板的任何建议?

我应该考虑制作通用 CRUD DAO 的其他问题吗?

干杯

尼克

4

2 回答 2

4

对于许多人来说,HibernateTemplate并且HibernateDaoSupport是在出局,而不是注入 aSessionFactory是首选。不是每个人,请注意,但这是我不久前采用的一种趋势,HibernateTemplate从我自己的通用 DAO 中删除。

这个博客有一个很好的总结。

作者的例子应该可以帮助你到达你想去的地方。

于 2009-09-16T07:05:13.067 回答
1

通用道

好吧,对我来说,如果您的 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) {
        //....
      }
    }

接线

连接所有的豆子不是致命的。现在有很多自动装配策略,你不必担心。在 Spring http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config中查看它们

于 2009-09-16T08:11:21.013 回答