我正在使用JPA / Hibernate和Spring开发我的第一个应用程序。我在DAO课上的第一次尝试是这样的:
@Repository(value = "userDao")
public class UserDaoJpa implements UserDao {
@PersistenceContext
private EntityManager em;
public User getUser(Long id) {
return em.find(User.class, id);
}
public List getUsers() {
Query query = em.createQuery("select e from User e");
return query.getResultList();
}
}
我还使用JpaDaoSupport
和JpaTemplate
找到了一些示例。你更喜欢哪种设计?我的例子有什么问题吗?
答案 0 :(得分:6)
我说你的方法听起来很完美。就个人而言,我不使用JpaDaoSupport
或JpaTemplate
,因为您可以使用EntityManager
和条件查询执行所需的一切。
JpaTemplate主要作为JdoTemplate和HibernateTemplate的兄弟存在,为习惯使用它的人提供相同的风格。对于新启动的项目,请考虑采用标准JPA样式的编码数据访问对象,基于通过Spring bean定义或JPA PersistenceContext注释注入的“共享EntityManager”引用。
答案 1 :(得分:4)
我更喜欢无模板方法(即您当前的方法),因为
这是Spring的推荐,正如博客文章“So should you still use Spring's HibernateTemplate and/or JpaTemplate??”和官方javadoc所总结的那样:
真正的问题是:选择哪种方法??
(...)
所以简而言之(就像JavaDoc for
HibernateTemplate
和JpaTemplate
已经提到了) 我建议你开始使用Session
和/或EntityManager
API 直接,如果你开始使用 Hibernate或JPA分别上新的 project-remember:Spring试图成为 非侵入性,这是另一个伟大的 例如!
答案 2 :(得分:2)
我个人更喜欢你的方法 - 注入EntityManager
并直接使用它。但JpaTemplate
也是一个不错的选择。我不喜欢它,因为添加了另一个不必要的抽象层。
答案 3 :(得分:1)
我不知道是否有“标准”方法。
如果你正在使用JPA,你可以选择实现:Hibernate,TopLink等。
如果您部署到Google App Engine,则会使用JPA与BigTable通话。
因此,如果你的目标是最大限度地提高可移植性,坚持使用JPA标准,而不是像Hibernate这样的特定实现,请确保你的DAO只使用JPA结构。