问题 Hibernate和JPA之间的@Entity有什么区别


当我在做Hibernate独立程序示例时,在我的脑海中使用@Entity注释创建了一点混乱。

这里我的问题是,我有一个来自javax.persistence包的@Entity的持久化类,然后它工作正常但是当我用Hibernate API替换@Entity注释时(即来自org.hibernate.annotations包)然后它给出了 org.hibernate.MappingException:未知实体:com.jetti.test.Employee

给予更多解释,非常感谢。


2277
2017-10-28 10:37


起源

这篇SO帖子解释了两个注释之间的区别以及找不到映射的原因: stackoverflow.com/questions/955515/... - Bohuslav Burghardt
和Hibernate实体已被弃用,因此您不应该使用它FWIW;看javadocs而不仅仅是使用 - Neil Stockton


答案:


@ javax.persistence.Entity仍然是强制性的,@ org.hibernate.annotations.Entity不是替代品。

文档

所以,hibernate的 @Entity 只是补充 javax.persistence.Entity,并提供一些更精细的调整选项。


5
2017-10-28 10:47



我以为Hibernate在下面使用JPA? - ha9u63ar
@hagubear JPA是一个规范,Hibernate(作为其他几个框架)实现了该规范。去引用 这个  JPA itself is just a specification, not a product; it cannot perform persistence or anything else by itself. JPA is just a set of interfaces, and requires an implementation.。在这个问题的上下文中,它意味着Hibernate实现了对它的支持 javax.persistence.Entity,但增加了更多功能 org.hibernate.annotations.Entity。 - Predrag Maric


Hibernate和JPA之间的区别是相同的,而JPA只是一个规范,意味着没有实现,而Hibernate是一个实现。

您可以使用JPA注释来注释您的类,但如果没有实现,则不会发生任何事情。

以抽象的方式,您可以将“JPA”视为指南。

当您使用带有JPA的Hibernate时,您实际上正在使用JPA实现的Hibernate。好处是你可以将Hibernate的JPA实现替换为JPA规范的另一个实现(Eclipse Link,DataNucleuse,..),否则如果直接使用Hibernate,你不能只切换到另一个ORM。

我希望它有所帮助。


JPA不是ORM实现,但只是实现对象关系映射(ORM)的指导原则,并且没有实现的底层代码。它不会为您的应用程序提供任何具体功能。其目的是提供一组规则和指南,JPA实现供应商可以遵循这些规则和指南以标准化方式创建ORM实现。

Hibernate是一个JPA提供者。当规范发生新变化时,hibernate将发布其更新的JPA规范实现。其他流行的JPA提供者是Eclipse Link(参考实现),OpenJPA等。 在此查看其他提供商

@javax.persistence.Entity 是实现JPA指南的提供程序的GuideLine

@org.hibernate.annotations.Entity 是Hibernate ORM的实现

你还可以 看到这个其他话题


4
2017-10-28 11:40



没有清楚地看到你的答案,请你详细说明一下 - @Xstian - jettisamba


org.hibernate.annotations.Entity 不推荐使用注释,并计划删除:

@deprecated查看预期替换的各个属性。至   在4.1中删除

每个属性都有一个专用注释(例如 的dynamicInsertDynamicUpdate)所以你应该总是起诉 javax.persistence.Entity 替代。


2
2018-06-18 12:47