我是Hibernate的新手,我不确定是否使用Hibernate SessionFactory或JPA EntityManagerFactory来创建Hibernate会话。
这两者有什么不同?使用这些工具的优缺点是什么?
我是Hibernate的新手,我不确定是否使用Hibernate SessionFactory或JPA EntityManagerFactory来创建Hibernate会话。
这两者有什么不同?使用这些工具的优缺点是什么?
当前回答
通过使用EntityManager,代码不再与hibernate紧密耦合。但是对于这种情况,在用法中我们应该使用:
javax.persistence.EntityManager
而不是
org.hibernate.ejb.HibernateEntityManager
类似地,对于EntityManagerFactory,使用javax接口。这样,代码是松散耦合的。如果有一个比hibernate更好的JPA 2实现,那么转换将很容易。在极端情况下,我们可以将类型转换为HibernateEntityManager。
其他回答
使用EntityManagerFactory方法允许我们使用回调方法注释,如@PrePersist, @PostPersist,@PreUpdate,而不需要额外的配置。
在使用SessionFactory时使用类似的回调将需要额外的努力。
相关Hibernate文档可以在这里和这里找到。
有关SOF问题和春季论坛讨论
通过使用EntityManager,代码不再与hibernate紧密耦合。但是对于这种情况,在用法中我们应该使用:
javax.persistence.EntityManager
而不是
org.hibernate.ejb.HibernateEntityManager
类似地,对于EntityManagerFactory,使用javax接口。这样,代码是松散耦合的。如果有一个比hibernate更好的JPA 2实现,那么转换将很容易。在极端情况下,我们可以将类型转换为HibernateEntityManager。
我想补充一点,你也可以通过从EntityManager调用getDelegate()方法来获取Hibernate的会话。
ex:
Session session = (Session) entityManager.getDelegate();
优先选择EntityManagerFactory和EntityManager。它们是由JPA标准定义的。
SessionFactory和Session是特定于休眠的。EntityManager调用底层的hibernate会话。如果你需要一些EntityManager中没有的特性,你可以通过调用:
Session session = entityManager.unwrap(Session.class);
我更喜欢JPA2 EntityManager API而不是SessionFactory,因为它感觉更现代。举个简单的例子:
JPA:
@PersistenceContext
EntityManager entityManager;
public List<MyEntity> findSomeApples() {
return entityManager
.createQuery("from MyEntity where apples=7", MyEntity.class)
.getResultList();
}
SessionFactory:
@Autowired
SessionFactory sessionFactory;
public List<MyEntity> findSomeApples() {
Session session = sessionFactory.getCurrentSession();
List<?> result = session.createQuery("from MyEntity where apples=7")
.list();
@SuppressWarnings("unchecked")
List<MyEntity> resultCasted = (List<MyEntity>) result;
return resultCasted;
}
我认为很明显,第一个看起来更干净,也更容易测试,因为EntityManager很容易被模仿。