【问题标题】:Can I use the Audited annotation of Hibernate Envers without including the whole Hibernate distribution?我可以在不包括整个 Hibernate 发行版的情况下使用 Hibernate Envers 的 Audited 注释吗?
【发布时间】:2018-02-08 06:29:12
【问题描述】:
在一个基于客户端-服务器的企业项目中,我将 Hibernate 与 Envers 结合使用。客户端开发人员希望拥有一个包含所有实体的共享库,以便他们可以在客户端开发中使用它们,而无需包含任何服务器端依赖项。由于这些实体使用@Audited 注释进行注释,因此客户端库将包含可接受的 Envers 依赖项。
但是,Envers 本身包含各种依赖项:hibernate-core、hibernate-jpa-api、javassist 等等,它们也将被包括在内。
有没有办法只在我的库中包含注释而不实际包含整个服务器端的东西?
【问题讨论】:
标签:
hibernate
jpa
annotations
hibernate-envers
【解决方案1】:
在这种情况下,最终将取决于 client 的上下文。
但假设您的客户端使用某种协议与您的服务器端后端通信,您可以将 org.hibernate.envers 注释打包到您的客户端部署中包含的单独工件中,就像我怀疑您正在使用 JPA 注释一样.
您必须注意的唯一问题是,在升级 hibernate-envers 工件时,您需要重新打包该特殊 jar 工件以考虑任何注释更改。
我知道用户要求能够通过 XML 映射配置 Envers。希望和目标是尝试将其作为 Hibernate 7 中 orm.xml 配置的一部分。
【解决方案2】:
在最终解决方案中,我最终在我的 Maven pom.xml 中包含了“hibernate-envers”依赖项。在依赖声明下方,我使用了一堆“排除”标签,以便排除那些仅在实际运行 Hibernate 时才重要但仅在使用注释和可能验证实体时不重要的依赖项。这样我就可以使用所有 Hibernate 注释(不仅是 @Audited),但仍然保持相对较小的占用空间。
我首先从 @Naros 的方法开始(感谢您的建议),但这导致我包含了越来越多的各种 Hibernate 注释所需的源代码依赖项。当然,这取决于您想要实现的目标,但对我个人而言,基于 Maven 的解决方案效果更好。这是为我工作的 POM:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-envers</artifactId>
<version>5.2.7.Final</version>
<exclusions>
<exclusion>
<groupId>antlr</groupId>
<artifactId>antlr</artifactId>
</exclusion>
<exclusion>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
</exclusion>
<exclusion>
<groupId>org.jboss</groupId>
<artifactId>jandex</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-jta_1.1_spec</artifactId>
</exclusion>
<exclusion>
<groupId>com.fasterxml</groupId>
<artifactId>classmate</artifactId>
</exclusion>
<exclusion>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
</exclusion>
<exclusion>
<groupId>org.hibernate.common</groupId>
<artifactId>
hibernate-commons-annotations
</artifactId>
</exclusion>
</exclusions>
</dependency>