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

在我之前的问题,DAO和服务层(JPA / Hibernate + Spring)之后,我决定在使用JPA / Hibernate,Spring和Wicket的应用程序中仅使用一个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
,你能节省一分钟吗?不会。你将有一个不必要的dao类,除了将成为EntityManager的包装器之外什么也不做。不要害怕在EntityManager(或hibernate中的会话)的帮助下在服务类中编写选择。 还有一点需要注意:您应该定义服务层的边框,不要让程序员返回或等待Entity类。 UI或WS层程序员根本不应该只知道有关DTO-s的实体类。实体对象具有大多数程序员不了解的生命周期。如果将实体对象存储在会话数据中并尝试在几秒或几小时后将其更新回数据库,则会出现严重问题。好吧,你可能不会这样做,但UI的程序员只知道服务层的参数类型和返回类型,只能保存一些代码行。     
我在寻找同样的事情。我发现了SpringSource提供的Spring-Data JPA项目。这是来自Hades的代码端口,现在(2011年初)被Spring吞并并更好地集成。 它允许您将单个dao(SimpleJpaRepository)与静态create一起使用,或者扩展基本JpaRepository类以使用现成的CRUD +方法创建任何特定于对象的dao。也可以通过使用params名称作为接口中的方法名称(不需要实现!)来支持grails,例如
findByLastname(String lastName);
看起来非常有前途 - 作为Spring项目的一部分肯定会确保它的未来。 我现在已经开始在即将开展的项目中实现这一点。     
如果您正在寻找第三方实施,您可以检查 http://www.altuure.com/projects/yagdao/。它是一个基于注释的通用DAO框架,支持JPA和hibernate     
您也可以查看http://codeblock.engio.net/data-persistence-and-the-dao-pattern/ 相关代码可以在github https://github.com/bennidi/daoism上找到 它集成了Spring和Hibernate和EclipseLink的配置示例     

要回复问题请先登录注册