Hibernate EntityManager文档states,即:
您可以将这三者结合使用,没有JPA的注释 编程接口和生命周期,甚至是纯本机Hibernate Core, 取决于项目的业务和技术需求。你可以在 所有时间都回归到Hibernate本机API,或者如果需要,甚至回归 本机JDBC和SQL。
使用JPA API(EntityManager)的代码显然更具可移植性(即使偶尔会回退到Hibernate Core)。
但是在使用纯Hibernate Core时我会有什么优势吗?我想知道,如果JPA 2模型真的适合Hibernate Core而没有任何矛盾吗? IOW,Core的后备是否容易且没有问题?
我主要担心的是:
也许差异不仅存在于API中,还存在于底层的语义中? (例如,可能发生冲突的不同事务/版本控制/锁定语义:在Core文档中提到了悲观锁定,但在EntityManager文档中没有提到 - 所以我仍然可以通过回退到Core而不会导致问题来使用悲观锁定吗?这样的事情...... 。)
答案 0 :(得分:13)
但是在使用纯Hibernate Core时我会有什么优势吗?
如果JPA 2.0支持您需要的东西,我认为直接使用Hibernate Core没有优势(而且使用JPA 2.0,差距变得更小,需要回退到Core异常,而不是规则,是一件非常好的事情)。
我想知道,如果JPA 2模型真的适合Hibernate Core而没有任何矛盾吗?
从JPA 1.0开始,Hibernate开发人员创建了Hibernate3,并考虑了“JPA”,并在Hibernate3中采用了JPA语义,默认值等。您可能希望在此Tech Talk: Gavin King on Hibernate3 and EJB3中听取Gavin:
在这次技术讲座中,King讨论了如何 Hibernate3构建并扩展 EJB3 ,解决了以下主题:
- Hibernate3的新功能
- Hibernate3与JBoss中的EJB3容器之间的关系
- Hibernate3与EJB3规范的区别
- Hibernate在EJB外部提供的自定义注释
- Hibernate的未来
根据我的实际经验,Hibernate与EJB 3不矛盾的事实是真的。
IOW,Core的后备是否容易且无问题?
无论您是否直接使用Core,都使用它(EntityManager
是Session
的包装器)。所以,是的,如果你真的需要,那么回归Core很容易(对于那些仍然不像规范查询的规范那样)。并且,不,这不会导致任何问题(因为您实际上在JPA中使用它或其子集)。
答案 1 :(得分:3)
很明显:取决于项目的业务和技术需求
但是在使用纯Hibernate Core时我会有什么优势吗?
不要忘记Hibernate Annotations和Hibernate EntityManager都是建立在Hibernate核心之上的。 再增加一层。除此之外,它依赖于存储在XML文件中的映射元数据。有些用户更喜欢使用XML文件而不是注释,因为它使域对象完全独立于您选择的DAO实现。但是在使用注释时,Hibernate与JPA书籍是明确的
与原生XML文件相比,减少了映射元数据的代码行,并且您可能希望注释具有更好的重构功能
JDBC >> Hibernate core >> Hibernate Annotations
...
JDBC >> Hibernate core >> Hibernate EntityManager
JPA 2更适合JPA 1未提供的内容。现在有很多新功能,例如
等等......
不要忘记JPA EntityManager允许您使用getDelegate方法检索其基础供应商特定的提供程序,如果您需要JPA不提供的功能。
答案 2 :(得分:1)
我喜欢直接使用Hibernate Core。我也更喜欢XML映射文件。
我对使用辅助层并不感兴趣,无法访问Hibernate核心功能。至于我关注持久层中的可移植性,是完全无问题。
JPA API相对于Hibernate API的优点很少 - 我看到人们使用JPA命名查询(其中Criteria可能更清晰,更好),并且JPA注释设计得更好。
除此之外,JPA只是一个增加复杂性的层次。潜在的开销 - 没有任何好处。在这种情况下,在正确的情况下,正确的决定是反对使用它。
数据库可移植性OTOH非常真实。我有自定义分配器(生成器),它们是完全可移植的,性能更高,性能更高。比疯狂的混乱简单,这是错误设计的Hibernate。
这种方法在多个主要商业,政府和政府部门都非常成功。遗留数据库重新设计项目。简而言之 - 关注什么是重要的 - 以及API之上的API,不是它。
答案 3 :(得分:0)
使用JPA api的好处远远超过使用纯hibernate的任何缺点。我不是专家,但我不知道任何情况下降到休眠是有益的。 (放下来做纯JDBC是另一回事。)
如果有人有任何分享的例子,我很乐意看到它们。