我是Hibernate的新手,不清楚是使用SessionFactory
还是EntityManagerFactory
来获取休眠会话。两者有什么区别?优点&缺点?Hibernate SessionFactory与EntityManagerFactory
回答
优选EntityManagerFactory
和EntityManager
。它们由JPA标准定义。
SessionFactory
和Session
是hibernate特定的。 EntityManager
在引擎盖下调用休眠会话。如果你需要的是不可用的EntityManager
一些特定的功能,你可以通过调用获取会话:
Session session = entityManager.unwrap(Session.class);
你是一个丰富的知识!我刚刚开始使用Hibernate,并希望将Hibernate与JPA Annotations一起使用 - 你会为初学者(除了Hibernate文档)推荐任何好的资源吗? – elpisu 2011-04-14 18:44:15
@elpisu - 我不能推荐,实际上。我一直只使用官方文档作为学习资源(至少在过去的2年中),所以我不知道其他任何可靠的东西。但是文档已经足够好了。 – Bozho 2011-04-14 18:50:32
@Bozho我知道它迟到了,但是使用SessionFactory和Session有什么缺点?为什么使用JPA更受欢迎?谢谢 – 2011-11-11 09:39:33
我想在这一点,你也可以通过调用EntityManager
getDelegate()
方法获得Hibernate的会话中添加。
例如:
Session session = (Session) entityManager.getDelegate();
请注意,根据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
使用EntityManagerFactory的方法使我们能够使用回调方法的注释像@PrePersist,@ PostPersist,@更新前,没有额外的配置。
使用类似的回调,而使用SessionFactory将需要额外的努力。
通过使用EntityManager的,代码已不再紧密耦合休眠。但对于这一点,在使用中我们应该使用:的
javax.persistence.EntityManager
代替
org.hibernate.ejb.HibernateEntityManager
同样,对于EntityManagerFactory的,使用的javax接口。这样,代码松散耦合。如果有一个比休眠更好的JPA 2实现,切换将很容易。在极端情况下,我们可以将类型转换为HibernateEntityManager。
我比较喜欢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的,可以很容易地嘲笑。
如果需要,您可以使任何代码变得复杂。 'return sessionFactory.getCurrentSession()。createQuery(“from User where id = 1”)。list()' – waste 2015-10-09 03:09:46
我认为你的第一个例子看起来更复杂。 – 2017-05-22 18:36:53
- 1. EntityManagerFactory和SessionFactory的区别?
- 2. 存储与Struts的Hibernate SessionFactory
- 3. Hibernate中的SessionFactory
- 4. Hibernate SessionFactory到Spring
- 5. Hibernate问题`SessionFactory`
- 6. Hibernate ASM Spring java.lang.NoSuchMethodError sessionFactory
- 7. Hibernate DAO/SessionFactory使用
- 8. 将JDBCTemplate与Hibernate SessionFactory结合使用?
- 9. spring + hibernate entityManagerFactory/configurations/context .xml
- 10. Springboot :: Hibernate ::无法构建Hibernate SessionFactory
- 11. Glassfish MySQL Hibernate无法构建Hibernate SessionFactory
- 12. sessionFactory - Spring hibernate集成问题
- 13. 在Spring中配置Hibernate sessionFactory
- 14. 如何解决java.lang.NoClassDefFoundError:org/hibernate/SessionFactory?
- 15. 一次性hibernate sessionFactory创建
- 16. Hibernate SessionFactory未保存更改
- 17. Hibernate 4.1至5.1 SessionFactory ConnectionProvider
- 18. 没有Spring的Hibernate SessionFactory bean
- 19. Hibernate SessionFactory注释错误
- 20. 使用Jboss Jndi查找访问sessionFactory例如java:/ hibernate/SessionFactory
- 21. Spring Hibernate JPA JSF“无法构建EntityManagerFactory”
- 22. SessionFactory的Hibernate不提交Oracle数据库
- 23. 无法使用Hibernate和Servlet创建SessionFactory
- 24. 无法构建Hibernate SessionFactory异常
- 25. 基于Hibernate SessionFactory注解的配置
- 26. 奇怪NumberFormatException的Hibernate中使用的SessionFactory
- 27. 使用Spring,Hibernate和LocalSessionFactoryBuilder配置sessionFactory
- 28. Hibernate SessionFactory:无法实例化bean
- 29. 在Hibernate中动态创建SessionFactory
- 30. Hibernate SessionFactory:如何在Tomcat中配置JNDI?
对重复问题的这个答案是非常好的。 http://stackoverflow.com/questions/23445830/hibernate-sessionfactory-vs-entitymanagerfactory#answer-23446379 – 2015-05-02 02:17:45