我们使用的技术是Spring(MVC)+ Hibernate用于后端,ZK框架用于前端。由于数据库有300多个表,我也创建了同样数量的POJO。使用Spring的DAO模式需要项目具有300个以上的DAO对象和300个以上的Service类。
这是我目前的做法:
POJO:
@Entity
@Table(name="test")
public class Test implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private Integer version;
private String m_name;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="jpa_id")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Version
@Column(name="jpa_version", insertable=false, updatable=false)
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
@Column(name="name", length=30)
public String getM_name() {
return m_name;
}
public void setM_name(String m_name) {
this.m_name = m_name;
}
}
DAO对象的接口:
public interface IDao<T> {
public List<T> getAll();
}
为了避免复制/粘贴,我创建了一个通用的DAO类,所有DAO对象都将继承它:
@Repository
public class GenericDAO<T extends Serializable> implements IDao<T> {
@Autowired
protected SessionFactory sessionFactory;
protected Class<T> entity;
@SuppressWarnings("unchecked")
public List<T> getAll() {
List<T> result = (List<T>) getSessionFactory().getCurrentSession().createQuery("from " + entity.getName()).list();
return result;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public void setEntity(Class<T> entity) {
this.entity = entity;
}
}
DAO对象:
@Repository
public class TestDAO extends GenericDAO<Test> {
public TestDAO() {
setEntity(Test.class);
}
}
服务接口:
public interface IService<T> {
public List<T> getAll();
}
服务实现:
@Service
public class TestService implements IService<Test> {
@Autowired
private IDao<Test> testDAO;
@Transactional(readOnly=true)
public List<Test> getAll() {
return testDAO.getAll();
}
public void setTestDAO(IDao<Test> testDAO) {
this.testDAO = testDAO;
}
}
我有两个问题:
如何编写一个通用服务,像上面的GenericDAO类一样,以避免c/p?
如果您查看DAO实现,那里唯一的东西就是构造函数。 有没有一种方法可以拥有“一个”DAO类来处理所有POJO,以及一个Service类来处理所有/一个DAO对象?