【发布时间】:2015-06-29 23:57:18
【问题描述】:
前段时间我开始学习java EE。我迅速转向 spring(mvc)+hibernate。当我学习数据库和与 spring+hibernate 的集成时,我想到了一个想法。
据我注意到(并理解)有一种通用的方法来构建对象结构,包括配置文件、实体、dao 接口和 dao 实现(因为我们只讨论 dbs,而不是控制器和其他应用程序的层) .我决定编写一个通用的 java 类并将其命名为BasicDao。 是以实体为类型的模板。
这实际上是有效的,我认为它比接口和实现要好得多,因为所有实体只需要一个类(如果你想为每个实体编写单独的实现,你最终可能会得到大量文件)。
我还在那里编写了一些模板函数,因此该类非常灵活(传递给数据库的类型没有例外)。这是代码
package local.bb.dao;
import java.util.List;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Repository(value = "basicDao")
@Transactional(propagation = Propagation.REQUIRED,readOnly = true)
public class BasicDao<ENTITY> {
private Class<ENTITY> data;
private SessionFactory sessionFactory;
public BasicDao() {
this.data = null;
}
@Transactional
public void addRecord(ENTITY t) {
this.sessionFactory.getCurrentSession().save(t);
}
@Transactional
public void removeRecord(ENTITY t) {
this.sessionFactory.getCurrentSession().delete(t);
}
@Transactional
public List<ENTITY> getAllRecords() {
return (List<ENTITY>)this.sessionFactory.getCurrentSession().createCriteria(this.data).list();
}
@Transactional
public <TYPE> ENTITY getRecordByParam(String param, TYPE value) {
return (ENTITY)this.sessionFactory.getCurrentSession().createCriteria(this.data).add(Restrictions.eq(param, value)).uniqueResult();
}
@Transactional
public <TYPE> List<ENTITY> getRecordsByParam(String param, TYPE value) {
return (List<ENTITY>)this.sessionFactory.getCurrentSession().createCriteria(this.data).add(Restrictions.like(param, value)).list();
}
// GETTERS / SETTERS
public SessionFactory getSessionFactory() {
return sessionFactory;
}
@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public Class<ENTITY> getData() {
return data;
}
public void setData(Class<ENTITY> data) {
this.data = data;
}
}
最后的问题是:这实际上是一个好方法吗?因为我从来没有在任何地方看到过这样的代码(谈到互联网上的教程和书籍)。
【问题讨论】:
-
由于您使用的是 Spring 和 Hibernate,因此 Spring Data JPA 项目对您来说应该是一本不错的读物。无需重新发明轮子,除非出于学习目的。但即便如此,Spring Data JPA 也是如何做到这一点的一个很好的例子。 projects.spring.io/spring-data-jpa
-
YAGDI(又一个通用的 Dao 实现)。互联网上有severalimplementations 用于通用dao 模式。与其自己编写一个可用的,不如使用 Spring Data JPA,你根本不需要实现......