47

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

4

5 回答 5

88

这是一个示例界面:

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);
    }
}
于 2010-10-08T10:56:15.817 回答
14

根据文章不要重复我们多年来使用这种技术的 DAO。在我们意识到我们犯了一个大错误之后,我们总是在与我们的模式问题作斗争。

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

如果您打电话myDao.saveEntity而不是简单地打电话,您会节省任何时间entityManager.saveEntity吗?不,您将拥有一个不必要的 dao 类,它什么都不做,只是 EntityManager 的一个包装器。不要害怕在 EntityManager(或休眠中的会话)的帮助下在您的服务类中编写选择。

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

于 2012-11-01T19:48:53.430 回答
5

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

于 2011-03-10T15:24:32.913 回答
2

if you are looking for a third party implementation , you can check http://www.altuure.com/projects/yagdao/ . it is a nnotation based generic DAO framework which supports JPA and hibernate

于 2010-11-03T10:35:23.700 回答
1

你也可以看看http://codeblock.engio.net/data-persistence-and-the-dao-pattern/

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

它集成了 Spring 和 Hibernate 和 EclipseLink 的配置示例

于 2014-02-06T10:01:17.820 回答