Java 使用Hibernate EntityManager(与Hibernate Core相比)有什么缺点吗?

Java 使用Hibernate EntityManager(与Hibernate Core相比)有什么缺点吗?,java,hibernate,orm,jpa,jpa-2.0,Java,Hibernate,Orm,Jpa,Jpa 2.0,Hibernate EntityManager文档: 您可以同时使用这三种注释,而不使用JPA 编程接口和生命周期,甚至是纯本机Hibernate内核, 取决于项目的业务和技术需求。你可以在 任何时候都可以使用Hibernate本机API,如果需要,甚至可以使用Hibernate本机API 本机JDBC和SQL 使用JPA API(EntityManager)的代码显然更具可移植性(即使偶尔会回退到Hibernate Core) 但是,当使用纯Hibernate内核时,我会有任何优势吗?我想知道

Hibernate EntityManager文档:

您可以同时使用这三种注释,而不使用JPA 编程接口和生命周期,甚至是纯本机Hibernate内核, 取决于项目的业务和技术需求。你可以在 任何时候都可以使用Hibernate本机API,如果需要,甚至可以使用Hibernate本机API 本机JDBC和SQL

使用JPA API(EntityManager)的代码显然更具可移植性(即使偶尔会回退到Hibernate Core)

但是,当使用纯Hibernate内核时,我会有任何优势吗?我想知道,JPA2模型是否真的适合Hibernate内核之上而没有任何矛盾?看,退回到核心是否总是容易且没有问题

我主要关心的是:


可能差异不仅在于API,还在于底层的语义?!(例如,不同的事务/版本控制/锁定语义可能会发生冲突:悲观锁定在核心文档中提到,但在EntityManager文档中没有提到——因此,我是否仍然可以通过返回到核心而使用悲观锁定而不引起问题?诸如此类的事情……)使用JPAAPI的好处远远大于使用纯hibernate的任何缺点。我不是一个专家,但我不知道在什么情况下,让自己进入冬眠状态是有益的。(放弃纯JDBC是另一回事。)

如果有人有任何例子可以分享,我很乐意看到。

很明显:取决于您项目的业务和技术需求

但是,当使用纯Hibernate内核时,我会有任何优势吗

不要忘记Hibernate注释和Hibernate EntityManager都构建在Hibernate核心之上所以再增加一层。除此之外,它还依赖于存储在XML文件中的映射元数据。一些用户更喜欢使用XML文件而不是注释,因为它使域对象完全独立于您选择的DAO实现。但是当使用注释时,Hibernate和JPA书是很清楚的

与本机XML文件相比,减少映射元数据的代码行,您可能会喜欢注释更好的重构功能

JPA 2更适合JPA 1未提供的内容。现在有很多新功能可用,例如

  • 面向对象查询API
  • 包装器的@embeddeble
  • @Embeddedables@ElementCollection的集合
等等

不要忘记JPA EntityManager允许您在需要JPA不提供的功能时使用方法检索其底层特定于供应商的提供者

但是,当使用纯Hibernate内核时,我会有任何优势吗

如果JPA2.0支持您所需的功能,那么在我看来,直接使用Hibernate Core没有任何优势(对于JPA2.0,差距变得越来越小,使得回退到Core的需求成为例外,而不是规则,这是一件非常好的事情)

我想知道,JPA2模型是否真的适合Hibernate内核之上而没有任何矛盾

从JPA1.0开始,Hibernate开发人员就在“记住JPA”的情况下创建了Hibernate3,并在Hibernate3中采用了JPA语义、默认值等。你可能想听听加文的这段话:

在这次科技谈话中,金讨论了如何 Hibernate3构建并扩展了 EJB3
,涉及以下主题:

  • Hibernate3的新特性
  • Hibernate3与JBoss中EJB3容器的关系
  • Hibernate3与EJB3规范的区别是什么
  • 可在EJB外部使用Hibernate的自定义注释
  • 冬眠的未来
根据我的实践经验,Hibernate与EJB3并不矛盾这一事实是正确的

看,退回到核心是否总是容易且没有问题

无论您是否直接使用Core,您都在使用它(EntityManager是
会话的包装器)。所以,是的,如果你真的需要,回到核心是很容易的(例如,对于规范中还没有的东西,比如QueryByExample)。而且,不,这不会引起任何问题(因为您在JPA中实际上正在使用它或它的子集)

相关问题

我喜欢直接使用Hibernate内核。我也更喜欢XML映射文件。

我对使用第二层访问Hibernate核心功能并不感兴趣。就我而言,持久层的可移植性是一个完全没有问题的问题

与Hibernate API相比,JPA API几乎没有什么真正的优势——我看到有人使用JPA命名查询(标准可能会更清晰更好),而JPA注释设计得更好一些

除此之外,JPA只是增加复杂性和潜在开销的一层——没有任何好处。在这种情况下,正确的决策是反对使用它。

数据库的可移植性非常真实。我有我使用的自定义分配器(生成器),它们是完全可移植的,并且比设计错误的Hibernate分配器性能更高、更简单


这种方法在多个主要的商业、政府和遗留数据库重建项目中非常成功。简言之——关注重要的东西——以及API之上的API,不是吗。

我完全同意,JPA的优势可能更大。但我真的很想知道,在没有EntityManager的情况下使用Hibernate Core是否还有任何(显著的)优势……事实上,JPA2.0中有悲观锁定,所以这是一个很糟糕的例子,但我明白你的意思。@Pascal:所以Hibernate文档中没有它(它在,但我没有)
JDBC >> Hibernate core >> Hibernate Annotations
JDBC >> Hibernate core >> Hibernate EntityManager