使用Annotations使用Spring Hibernate编写更少的DAO

我的Spring + Hibernate配置文件很小且非常紧凑。 我使用自动扫描来查找我的模型实体/ daos。

我不想在我的层次结构中为每个实体编写DAO + DAOImpl。

有些人可能有资格拥有自己的,如果他们与其他实体有复杂的关系,并且需要的不仅仅是基本的CRUDfunction。 但其余的……

有没有办法规避事实上的标准?

比如,像通用的DAO,ex:

http://www.ibm.com/developerworks/java/library/j-genericdao/index.html

然后我可以做类似的事情

GenericDao dao = appContext.getBean("genericDao"); dao.save(car); dao.save(lease); 

这有可能带注释吗? 我不想在xml中配置任何东西。 如果我不能在上面做,是否仍然可以有一个GenericDaoImpl.java类似于:

  @Repository("carDao") @Repository("leaseDao") class GenericDaoImpl extends CustomHibernateDaoSupport implements GenericDao { ... } 

接着

  GenericDao dao = appContext.getBean("carDao"); dao.save(car); dao = appContext.getBean("leaseDao"); //carDao is garbage coll. dao.save(lease); 

这有用吗?

使用generics,您可以尝试这样的事情:

 @Repository @Transactional public class GenericDAOImpl implements GenericDAO { @Autowired private SessionFactory factory; public void persist(T entity) { Session session = factory.getCurrentSession(); session.persist(entity); } @SuppressWarnings("unchecked") public T merge(T entity) { Session session = factory.getCurrentSession(); return (T) session.merge(entity); } public void saveOrUpdate(T entity) { Session session = factory.getCurrentSession(); session.saveOrUpdate(entity); } public void delete(T entity) { Session session = factory.getCurrentSession(); session.delete(entity); } } 

内容可能不同,但总体思路是适用的。

您应该能够通过使用在控制器和服务类中自动assemblyDAO

 @Autowired private GenericDAO carDao; 

您可以将Spring / Hibernate与JPA结合使用,JPA为大量基本持久性任务提供EntityManager:

 @Service public class CarService { @PersistenceContext private EntityManager em; public void saveCarAndLease(Car car, Lease lease) { em.persist(car); em.persist(lease); } } 

它还将处理事务和简单查询,而无需编写DAO。 对于更复杂的操作,您仍然可以编写DAO并回退到Hibernate的SessionFactory(尽管JPA也是一个选项)。

一些教程建议您仍然应该编写DAO来抽象JPA管道。 但是,我个人认为这是不必要的(JPA具有非常小的集成足迹),事实上这也是Spring Roo处理幕后数据层的方式。

您是否尝试过使用Spring Data ? 我的意思是说Spring JPA你可以使用存储库。
您可以消除为每个实体编写所有内容。