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

在我之前的问题, DAO和服务层(JPA / Hibernate + Spring)之后 ,我决定在使用JPA / Hibernate,Spring和Wicket的应用程序中为我的数据层(至less在开头)使用一个DAO。 提出了使用通用的CRUD方法,但我不太确定如何使用JPA来实现这一点。 请给我一个例子,或者分享一个关于这个的链接?

这里是一个示例界面:

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

根据文章不要重复DAO我们使用这种技术多年。 在意识到我们犯了一个大错误之后,我们一直在努力解决模式方面的问题。

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

如果您调用myDao.saveEntity而不是简单的entityManager.saveEntity您可以节省多less时间? 不会。你将有一个不需要的dao类,但是将会是EntityManager的一个包装。 不要害怕在EntityManager的帮助下(或者hibernate中的会话)在服务类中写入select。

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

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

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

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

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

它集成了Spring和Hibernate和EclipseLink的configuration示例