2011-04-12 141 views
188

我是Hibernate的新手,不清楚是使用SessionFactory还是EntityManagerFactory来获取休眠会话。两者有什么区别?优点&缺点?Hibernate SessionFactory与EntityManagerFactory

+3

对重复问题的这个答案是非常好的。 http://stackoverflow.com/questions/23445830/hibernate-sessionfactory-vs-entitymanagerfactory#answer-23446379 – 2015-05-02 02:17:45

回答

288

优选EntityManagerFactoryEntityManager。它们由JPA标准定义。

SessionFactorySession是hibernate特定的。 EntityManager在引擎盖下调用休眠会话。如果你需要的是不可用的EntityManager一些特定的功能,你可以通过调用获取会话:

Session session = entityManager.unwrap(Session.class); 
+0

你是一个丰富的知识!我刚刚开始使用Hibernate,并希望将Hibernate与JPA Annotations一起使用 - 你会为初学者(除了Hibernate文档)推荐任何好的资源吗? – elpisu 2011-04-14 18:44:15

+1

@elpisu - 我不能推荐,实际上。我一直只使用官方文档作为学习资源(至少在过去的2年中),所以我不知道其他任何可靠的东西。但是文档已经足够好了。 – Bozho 2011-04-14 18:50:32

+6

@Bozho我知道它迟到了,但是使用SessionFactory和Session有什么缺点?为什么使用JPA更受欢迎?谢谢 – 2011-11-11 09:39:33

28

我想在这一点,你也可以通过调用EntityManagergetDelegate()方法获得Hibernate的会话中添加。

例如:

Session session = (Session) entityManager.getDelegate(); 
+16

请注意,根据java文档,'unwrap()'是首选**而不是'getDelegate()':[javaee 6](http://docs.oracle.com/javaee/6/api/javax /persistence/EntityManager.html#getDelegate())和[javaee 7](http://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#getDelegate())。 – ryenus 2014-09-10 02:54:48

19

使用EntityManagerFactory的方法使我们能够使用回调方法的注释像@PrePersist,@ PostPersist,@更新前,没有额外的配置。

使用类似的回调,而使用SessionFactory将需要额外的努力。

相关Hibernate文档可以找到herehere

Related SOF QuestionSpring Forum discussion

2

通过使用EntityManager的,代码已不再紧密耦合休眠。但对于这一点,在使用中我们应该使用:的

javax.persistence.EntityManager 

代替

org.hibernate.ejb.HibernateEntityManager 

同样,对于EntityManagerFactory的,使用的javax接口。这样,代码松散耦合。如果有一个比休眠更好的JPA 2实现,切换将很容易。在极端情况下,我们可以将类型转换为HibernateEntityManager。

12

我比较喜欢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的,可以很容易地嘲笑。

+18

如果需要,您可以使任何代码变得复杂。 'return sessionFactory.getCurrentSession()。createQuery(“from User where id = 1”)。list()' – waste 2015-10-09 03:09:46

+0

我认为你的第一个例子看起来更复杂。 – 2017-05-22 18:36:53

相关问题