首页 文章

使用hibernate sessionFactory还是JPA entityManager?

提问于
浏览
13

我正在开发一个使用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,对吗?

2 回答

  • 11

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

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

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

    我想要使用完整的JPA规范和entityManager的唯一原因是能够相对容易地为不同的JPA 2.0兼容ORM切换Hibernate,对吧?使用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的原因 . 刷新它,即发送带有生成的id的插入查询,是唯一的方法 .

    这同样适用于会话工厂 .

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

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

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

  • 2

    JPA是一个基于Hibernate的接口,它是jdbc上的一个接口,因此越接近jdbc,您对查询的控制就越多,但您可以进一步从对象/关系持久性开始 . 是的,休眠可能有一些工具可以JPA此时没有提供(即休眠空间)Hibernate是乐趣,并且可以使用JPA注解映射域模型(如果你去的注释方式在.hbm文件) . 和@Transactional注释在Spring的工作方式它不无论使用休眠或JPA,因为你不需要session.open()... ... session.beginTranscation ... session.close等等......这一切详细Hibernate代码消失了!有很多关于Hibernate和greate书籍的文档 . 至于JPA,我不能说我找到了棕褐色的书......

相关问题