我正在开发一个使用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,对吗?
答案 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我不能说我找到了这本书......