Java 在通用Spring CRUD DAO中获取正确的Hibernate模板
我对Spring还是一个新手,我发现制作所有这些CRUD DAO都很烦人,所以我制作了一个“公共类GenericCRUDDAO扩展HibernateDaoSupport实现CRUDDAO”。在我的服务对象中,我只说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
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) {
//....
}
}