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

时间:2011-11-22 20:58:38

标签: java hibernate spring generics dao

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

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

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

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

说,像通用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);

这是否实用?

3 个答案:

答案 0 :(得分:5)

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

@Repository
@Transactional
public class GenericDAOImpl<T> implements GenericDAO<T> {

    @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);
    }

}

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

然后,您应该可以使用

在控制器和服务类中自动装配DAO
@Autowired
private GenericDAO<Car> carDao;

答案 1 :(得分:2)

您可以组合Spring/Hibernate with 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处理幕后数据层的方式。

答案 2 :(得分:1)

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