junit 将Hibernate 6与JPA配合使用

col17t5w  于 2022-11-11  发布在  其他
关注(0)|答案(2)|浏览(148)

根据新的信息,我重新表述我的问题,保留以下原文以供参考:
当切换到Hibernate 6时,我得到了要包含新包的要求。我不明白为什么需要这些包,所以我需要进一步的信息,它们做什么。在Google或Stack Overflow上进行搜索大多以“只添加包”结束。

问题(请参阅下面的答案):

  • 为什么Hibernate 6中需要Hibernate验证器,而Hibernate 5中不需要?
  • 为什么需要hibernate-core-jakarta而不是hibernate-core?
  • 为什么需要jakarta.el-api?
    原文:

我使用JPA指定的功能,并将Hibernate作为实现。因此,我包括了jakarta.persistence-api和jakarta.validation-api,以及所需的Hibernate包。
直到版本5.6.10,包括hibernate-core-jakarta似乎是正确的选择。使用该软件包,一切都可以开箱即用。
我现在已经切换到Hibernate 6.1.2。这里,hibernate-core-jakarta已经不存在了。因此,我现在添加了hibernate-core。根据我收到的错误消息,我还添加了hibernate-validator 7.0.5.Final和jakarta.el-api 5. 0. 1。
现在,事情似乎奏效了。不过,我还是想知道:为什么hibernate-core-jakarta被删除了?是我找到的解决方案正确,还是现在有隐藏的问题?
编辑:基于我读到的更多的东西,我可能可以更好地表达什么是困惑我:

  • 据我所知,Hibernate最初是一个独立于JPA的库。后来它被修改以实现JPA标准。(如果我说错了,请纠正我。)
  • 我认为使用hibernate-core-jakarta包相当于“使用JPA兼容性”,而hibernate-core相当于“只使用Hibernate”。
  • 现在我想也许hibernate-core-jakarta意味着“使用来自Jakarta的JPA”,而hibernate-core意味着“使用来自Java EE(javax)的旧JPA”。
  • 当然,这意味着现在Java EE不再受支持,因此hibernate-core继承了hibernate-core-jakarta的功能!
  • 然而,如果这是真的,为什么我开始需要额外的库时,移动到新的版本?
vdgimpew

vdgimpew1#

您可以查看/调试org.hibernate.cfg.beanvalidation.BeanValidationIntegrator来了解为什么为您的应用程序激活bean验证,并因此需要一个可用的实现。通常,只有当API在类路径上可用时才需要实现,所以如果您不想使用jakarta.validation,只需确保它不是您的依赖项的一部分。
jakarta.el-apijakarta.validation的一个可传递需求,因此问题的根源似乎是您在某种程度上依赖于验证API。

yiytaume

yiytaume2#

为什么需要hibernate-core-jakarta而不是hibernate-core?

Hibernate 5仍然是使用Java EE(javax.*)中的Java持久性API编写的。有一个替代方案已经使用了Jakarta持久性API(jakarta.*)。我使用这个替代方案是因为我已经使用了Jakarta。
Hibernate 6将Jakarta设为默认值,因此新的hibernate-core是hibernate-core-jakarta的直接继承者,旧的hibernate-core已经停产。

为什么Hibernate 6中需要Hibernate验证器,而Hibernate 5中不需要?

我仍然不知道为什么它只从Hibernate 6开始,但是对hibernate-validator的需求源于jakarta. validation的包含。我正在用@NotNull做标记,这是最初导致它的原因。

为什么需要jakarta.el-api?

我一直在单元测试和不断增长的应用程序之间无组织地切换。在单元测试中使用Hibernate时,需要jakarta.el-api。因此,有时我需要它,有时我不需要。而且,这还不够。您还需要API的实现。选择正确的实现是基于您的项目。here是一个很好的概述。
Apparently,您也可以禁用这部分代码。但是,答案仍然依赖于javax版本,我无法重现它。

相关问题