我正在处理的当前应用程序是一个很大的应用程序。该数据库由 300 多个表组成,并且还在不断增长。目前它是一个桌面应用程序,但我们正在将其转移到网络上。
我们为此使用的技术是用于后端的 Spring (MVC) + Hibernate 和前端的 ZK 框架。在数据库中有 300 多个表,我最终也创建了那么多 POJO。使用 Spring 的 DAO 模式,这需要项目具有 300 多个 DAO 对象和 300 多个服务类。
这就是我目前的做法:
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 实现,唯一的事情就是构造函数。有没有办法拥有一个处理所有 POJO 的“一个”DAO 类和一个处理所有/一个 DAO 对象的服务类?