单DAO和通用CRUD方法(JPA/Hibernate + Spring)

Joh*_*nak 45 java dao jpa crud genericdao

在我之前的问题,DAO和服务层(JPA/Hibernate + Spring)之后,我决定在使用JPA/Hibernate,Spring和Wicket的应用程序中仅使用一个DAO作为我的数据层(至少在开始时).提出了使用通用CRUD方法,但我不太确定如何使用JPA实现它.你能给我一个例子或分享一个关于这个的链接吗?

Pas*_*ent 86

这是一个示例界面:

public interface GenericDao<T, PK extends Serializable> {
    T create(T t);
    T read(PK id);
    T update(T t);
    void delete(T t);
}
Run Code Online (Sandbox Code Playgroud)

并实施:

public class GenericDaoJpaImpl<T, PK extends Serializable> 
    implements GenericDao<T, PK> {

    protected Class<T> entityClass;

    @PersistenceContext
    protected EntityManager entityManager;

    public GenericDaoJpaImpl() {
        ParameterizedType genericSuperclass = (ParameterizedType) getClass()
             .getGenericSuperclass();
        this.entityClass = (Class<T>) genericSuperclass
             .getActualTypeArguments()[0];
    }

    @Override
    public T create(T t) {
        this.entityManager.persist(t);
        return t;
    }

    @Override
    public T read(PK id) {
        return this.entityManager.find(entityClass, id);
    }

    @Override
    public T update(T t) {
        return this.entityManager.merge(t);
    }

    @Override
    public void delete(T t) {
        t = this.entityManager.merge(t);
        this.entityManager.remove(t);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案.只是一些注释:我宁愿将Class作为参数传递给构造函数方法(而不是未经检查的强制转换); 不应重新分配delete方法中的参数t,并且该类最好是抽象的. (3认同)
  • 如何适应slsb和pojo实体(代表db表)? (2认同)

Bal*_*dos 14

基于文章不要重复DAO,我们多年来一直使用这种技术.在我们意识到我们犯了一个大错误之后,我们总是在解决模式问题.

通过使用诸如Hibernate或JPA之类的ORM工具,您不必分别考虑DAO和服务层.您可以使用服务类中的EntityManager,因为您知道事务的生命周期和实体类的逻辑.

如果你打电话myDao.saveEntity而不是简单的话,你能节省一分钟entityManager.saveEntity吗?不会.你将有一个不必要的dao类,除了将成为EntityManager的包装器之外什么也不做.不要害怕在EntityManager(或hibernate中的会话)的帮助下在服务类中编写选择.

还有一点需要注意:您应该定义服务层的边框,不要让程序员返回或等待Entity类.UI或WS层程序员根本不应该只知道有关DTO-s的实体类.实体对象具有大多数程序员不了解的生命周期.如果将实体对象存储在会话数据中并尝试在几秒或几小时后将其更新回数据库,则会出现严重问题.好吧,你可能不会这样做,但只有知道参数类型和服务层返回类型的UI程序员才能保存一些代码行.


Dan*_*y C 5

我在寻找同样的事情.我发现了SpringSource提供的Spring-Data JPA项目.这是来自Hades的代码端口,现在(2011年初)被Spring吞并并更好地集成.它允许您将单个dao(SimpleJpaRepository)与静态create一起使用,或者扩展基本JpaRepository类以使用现成的CRUD +方法创建任何特定于对象的dao.也只是通过使用params名称作为方法的名称 - 在接口中(不需要实现!)也允许grails这样的grails,即findByLastname(String lastName); 看起来非常有前途 - 作为Spring项目的一部分肯定会确保它的未来.我现在已经开始在即将开展的项目中实现这一点.