Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在通用Spring CRUD DAO中获取正确的Hibernate模板_Java_Hibernate_Spring_Templates_Crud - Fatal编程技术网

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

Java 在通用Spring CRUD DAO中获取正确的Hibernate模板,java,hibernate,spring,templates,crud,Java,Hibernate,Spring,Templates,Crud,我对Spring还是一个新手,我发现制作所有这些CRUD DAO都很烦人,所以我制作了一个“公共类GenericCRUDDAO扩展HibernateDaoSupport实现CRUDDAO”。在我的服务对象中,我只说 private GenericCRUDDAO<User, Integer> userDAO = new GenericCRUDDAO<User, Integer>(); 给我一个空的ht。不太好。我想把它连接起来,意思是生成一个GenericCruddaoB

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

private GenericCRUDDAO<User, Integer> userDAO = new GenericCRUDDAO<User, Integer>();
给我一个空的ht。不太好。我想把它连接起来,意思是生成一个GenericCruddaoBean,然后设置一个静态AnnotationSessionFactoryBean,但这仍然不能给我一个HibernateTemplate。关于如何解决这个问题以便使用Hibernate模板,有什么建议吗

关于制作一个我应该考虑的通用CRUD DAO还有什么问题吗

干杯


Nik

对于许多人来说,
HibernateTemplate
HibernateDaoSupport
都是失败的,而注入
会话工厂是首选。请注意,不是每个人都这样,但这是一种趋势,我不久前就采用了这种趋势,从我自己的泛型DAO中删除了
HibernateTemplate

有一个很好的总结


作者的示例应该能够帮助您到达您想要的位置。

对于许多人来说,
HibernateTemplate
HibernateDaoSupport
是不可行的,而注入
SessionFactory
是首选。请注意,不是每个人都这样,但这是一种趋势,我不久前就采用了这种趋势,从我自己的泛型DAO中删除了
HibernateTemplate

有一个很好的总结

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

GenericDao 嗯,对我来说,如果您的GenericDAO是“generic”,那么您可能只需要一个实例,并使用该实例完成所有操作

我敢肯定,你不会因为这个例子而烦恼,你会因为重复而生气(我同意你的看法)

例如,可以将实体类传递给泛型方法

  • public void save(类,E…):用于保存E类型的一个或多个实例,E是您的实体之一
  • 公共E加载(类,长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
    }
    
    /**假设实体具有一个带有getIdentit()的超类SuperEntity*/
    公共类GenericDaoImpl实现GenericDao{
    /**保存一组实体*/
    公共作废保存(超级实体…实体){
    用于(超级实体:实体){
    getSession().save(实体);
    }
    }
    /**加载任何实体*/
    公共E负载(类entityClass,长标识){
    返回(E)getSession().load(entityClass,ident);
    }
    //其他通用方法
    }
    

变体 在我们的应用程序中,我们实际上有一个用于此的变体。因为我们对每个Dao都有许多特定的请求,所以我们无论如何都需要特定的Dao类(创建类并连接它),所以为了避免Dao的特殊情况,我们立即创建特定的Dao类

编码 但我们绝不会重复代码。我们所有的DAO都扩展了GenericDao,在构造函数中提供了所需的类参数。示例代码(不完整,基本概念简单):

公共抽象类GenericDaoImpl
实现GenericDao{
/**可用于泛型方法,因此它不是参数
*对于泛型方法*/
私有最终类实体类;
受保护的GenericDaoImpl(类entityClass){
this.entityClass=entityClass;
}
//通用实现;可以提高效率,因为它可能
//批量发送订单
公共作废保存(E…实体){
用于(超级实体:实体){
getSession().save(entityClass,entity.getIdentit());
}
//可能添加刷新,从会话中清除它们。。。
}
//其他通用方法
}
公共类PersonDaoImpl扩展了GenericDaoImpl
佩尔松道{
/**构造函数,使用类参数实例化超类*/
公众人物{
超级(Person.class);
}
/**具体方法*/
公共列表findByAge(int minAge,int maxAge){
//....
}
}
装电线 给所有的豆子接线不是致命的。现在,有很多自动布线策略,你不必担心。春天见他们

通用DAO 嗯,对我来说,如果您的GenericDAO是“generic”,那么您可能只需要一个实例,并使用该实例完成所有操作

我敢肯定,你不会因为这个例子而烦恼,你会因为重复而生气(我同意你的看法)

例如,可以将实体类传递给泛型方法

  • public void save(类,E…):用于保存E类型的一个或多个实例,E是您的实体之一
  • 公共E加载(类,长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
    }
    
    /**假设实体具有一个带有getIdentit()的超类SuperEntity*/
    公共类GenericDaoImpl实现GenericDao{
    /**保存一组实体*/
    公共作废保存(超级实体…实体){
    用于(超级实体:实体){
    getSession().save(实体);
    }
    }
    /**加载任何实体*/
    公共E负载(类entityClass,长标识){
    返回(E)getSession().load(entityClass,ident);
    }
    //其他通用方法
    }
    

变体 在我们的应用程序中,我们实际上有一个用于此的变体。因为我们对每个Dao都有许多特定的请求,所以我们无论如何都需要特定的Dao类(创建类并连接它),所以为了避免Dao的特殊情况,我们立即创建特定的Dao类

编码 但我们绝不会重复代码。我们所有的DAO都扩展了GenericDao,在构造函数中提供了所需的类参数。示例代码(不完整,基本概念简单):

公共摘要cl
    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) {
        //....
      }
    }