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

时间:2010-10-08 07:42:31

标签: java jpa crud dao genericdao

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

5 个答案:

答案 0 :(得分:86)

以下是一个示例界面:

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

实施:

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

答案 1 :(得分:14)

根据文章Don't repeat the DAO,我们多年来一直使用这种技术。在我们意识到我们犯了一个大错误后,我们总是在处理我们的模式问题。

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

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

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

答案 2 :(得分:5)

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

答案 3 :(得分:2)

如果您正在寻找第三方实施,您可以查看 http://www.altuure.com/projects/yagdao/。它是一个基于注释的通用DAO框架,它支持JPA和hibernate

答案 4 :(得分:1)

您还可以查看http://codeblock.engio.net/data-persistence-and-the-dao-pattern/

相关代码可以在github https://github.com/bennidi/daoism

上找到

它与Spring集成以及Hibernate和EclipseLink的配置示例