使用hibernate sessionFactory还是JPA entityManager?

Cor*_*han 14 java spring hibernate jpa

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

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

起初我计划使用entityManager和完整的JPA规范,所以我的项目将与Hibernate分离,我可以将其换成其他东西,比如EclipseLink,如果花哨的话带我或后来说服了我的东西.

但是,似乎entityManager有一些非常重要的限制.

我的问题:

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

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

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

NoD*_*und 12

我会坚持使用JPA2,就像你会使用List而不是ArrayList:你赞成实现的接口(或抽象).除了HQL比JPQL或异域特征更"知道"以外,没有太大的区别.还记得JPA是在Hibernate之后制作的,Hibernate是JPA背后的"灵感".

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

我还评论了你的一部分问题:

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

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

你可以在这里阅读我的问题,看看在使用两者时遇到的问题的例子(它是一个带有配置文件的maven项目,用于将JPA2.1 impl从EclipseLink切换到Hibernate).我删除了EclipseLink,因为我无法命名数据库对象(或者更确切地说,指定数据库对象的名称),就像我想要的那样.

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

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

这同样适用于会话工厂.

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

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

您可以将其视为针对ORM的巨魔,但是为了有效地进行数据库更新,请使用普通JDBC(或Spring Jdbc模板).至少你会知道什么时候会更新数据,你将能够更好地优化(批量更新等).