使用休眠会话工厂或 JPA 实体管理器?

2022-09-04 21:26:21

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

我正在尝试决定是使用 JPA 实体管理器还是特定于休眠的 sessionFactory。

起初,我计划使用entityManager和完整的JPA规范,这样我的项目就会与Hibernate分离,如果花哨的东西把我带走了,或者后来有什么东西说服了我,我可以把它换成别的东西,比如EclipseLink。

但是,实体管理器似乎有一些非常重要的限制。

我的问题:

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

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

我喜欢我的项目与Hibernate相对分离的想法,但我宁愿能够从一开始就编写有效的数据库更新。所以我应该切换到我的项目配置为休眠和会话工厂,对吧?


答案 1

我会坚持使用JPA2,就像你会使用的那样,而不是:你更喜欢接口(或抽象)而不是实现。除了HQL知道比JPQL或异国情调的功能“更多”的东西之外,没有太大的区别。还要记住,JPA是在Hibernate之后制作的,Hibernate是JPA背后的“灵感”。ListArrayList

对于异国情调的功能:休眠实体管理器包装休眠会话。如果您确实需要它们,可以将 转换为 Hibernate 接口 (),然后使用该会话。但是,如果我说我试过了,那我就是在骗你。EntityManagerorg.hibernate.jpa.HibernateEntityManager

我还评论了您的部分问题:

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

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

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

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

这取决于您生成实体 ID 的方式。但仔细想想:在持久性上下文需要持久化实体之前,实体不会持久化。这就是您没有ID的原因。刷新它,即使用生成的ID发送插入查询,是执行此操作的唯一方法。

这同样适用于会话工厂。

但是,您可能能够从 Hibernate 访问序列生成器,但您也可以在本机 SQL 中使用 .EntityManager

我喜欢我的项目与Hibernate相对分离的想法,但我宁愿能够从一开始就编写有效的数据库更新。所以我应该切换到我的项目配置为休眠和会话工厂,对吧?

你可以把它当作对ORM的巨魔,但是为了有效地更新数据库,请使用普通的JDBC(或Spring Jdbc模板)。至少你会知道什么时候会更新数据,并且你将能够更好地优化(批量更新等)。


答案 2

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


推荐