使用hibernate sessionFactory还是JPA entityManager?

时间:2013-01-30 08:06:12

标签: java spring hibernate jpa

我正在开发一个使用Hibernate 4.1,Spring 3.1和JPA 2.0的项目,我想验证我从互联网上收集的内容是否正确。

我正在尝试决定是使用JPA entityManager还是使用特定于hibernate的sessionFactory。

起初我计划使用entityManager和完整的JPA规范,所以我的项目将与Hibernate分离,我可以将其切换为其他东西,例如EclipseLink,如果看上去花了我或者后来说服我的话。 / p>

然而,似乎entityManager有一些非常重要的限制。

我的问题:

我想要使用完整的JPA规范和entityManager的唯一原因是能够相对容易地为不同的JPA 2.0兼容ORM切换Hibernate,对吧?使用entityManager确实没有性能/功能/易编程优势吗?

其次,似乎hibernate sessionFactory比entityManager有很多好处。到目前为止,我遇到的问题是entityManager无法执行实体列表的批量插入,我已经读过sessionFactory了。我还读到sessionFactory可以自动返回自动生成的实体ID,而使用entityManager,您需要结束事务/刷新持久化上下文以提取新生成的id。

我喜欢我的项目与Hibernate相对分离的想法,但我更愿意从一开始就编写高效的数据库更新。所以我应该切换到我的项目配置为hibernate和sessionFactory,对吗?

2 个答案:

答案 0 :(得分:11)

我会坚持使用JPA2,就像你使用List而不是ArrayList一样:你赞成实现的接口(或抽象)。除了HQL知道"更多"之外没有太大区别。比JPQL或奇特的功能。还要记住,JPA是在Hibernate之后制作的,Hibernate是"灵感来源于#34; JPA背后。

对于奇特的功能:Hibernate实体管理器包装一个Hibernate会话。如果您真的需要它们,可以将EntityManager强制转换为Hibernate接口(org.hibernate.jpa.HibernateEntityManager),然后使用该会话。但如果我说我尝试过,我会骗你的。

我还评论了部分问题:

  

我想要使用完整JPA规范的唯一原因   entityManager是能够为不同的Hibernate切换出来的   JPA 2.0兼容ORM比较容易,对吧?真的没有   性能/功能/易编程使用有益   entityManager?

从Hibernate切换到EclipseLink并不意味着你只需要交换jar"。映射和注释解析不一样,您会遇到可能阻止您切换的问题。

您可以阅读my question here,了解我在使用两者时遇到的问题示例(它是一个带有配置文件的maven项目,用于将JPA2.1 impl从EclipseLink切换到Hibernate)。我删除了EclipseLink,因为我无法命名数据库对象(或者更确切地说,指定数据库对象的名称)。

  

其次,似乎hibernate sessionFactory有很多   对entityManager的好处。到目前为止,我遇到了这个问题   entityManager不能执行实体列表的批量插入,   我已经读过sessionFactory了。我也读过那个   sessionFactory可以自动返回自动生成的实体ID,   使用entityManager时,您需要结束事务/刷新   持久化上下文来拉取新生成的id。

这取决于您如何生成实体ID。但请想一想:在持久化上下文需要持久化之前,您的实体不会持久存在。这就是你没有身份证明的原因。刷新它,即发送带有生成的id的插入查询,是唯一的方法。

同样适用于会话工厂。

但是,您可以从Hibernate访问序列生成器,但您也可以使用EntityManager在本机SQL中执行此操作。

  

我喜欢我的项目相对脱钩的想法   Hibernate,但我宁愿能够编写高效的数据库   从一开始就更新。所以我应该切换到我的项目   配置为hibernate和sessionFactory,对吧?

您可以将其视为针对ORM的巨魔,但为了有效地进行数据库更新,请使用纯JDBC(或Spring Jdbc模板)。至少您知道何时更新数据,并且您将能够更好地优化(批量更新等)。

答案 1 :(得分:2)

JPA是一个基于Hibernate的接口,它是jdbc上的一个接口,所以越接近jdbc,你对查询的控制就越多,但你可以从对象/关系持久性中获得更多。 是的,Hibernate可能有一些jpa目前无法提供的工具(即休眠空间) Hibernate很有趣,可以使用JPA注释来映射域模型(如果你在.hbm文件上进行注释)。 @Transactional注释在Spring中的工作方式无论你使用hibernate还是jpa都没关系,因为你不需要session.open()... session.beginTranscation ... session.close ... etc ...所有这些详细Hibernate代码消失了! 有很多关于Hibernate和greate书籍的文档。至于JPA我不能说我找到了这本书......