我的问题可能很简单,但是有关hibernate-envers的文档说,我只需要两个步骤就可以使hibernate-envers起作用:
首先,我添加了:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-envers</artifactId>
<version>5.2.12.Final</version>
</dependency>
其次,我在实体上方添加了@Audited批注:
@Entity
@Audited
@Table(name = "users")
public class User {...}
经过这两个步骤,我可以选择:
教程/文档等中的许多ppl都说您应该单独进行操作,因此这就是我的架构(在thymeleaf中)的样子。
要手动创建模式,我必须使用一个特殊的表(通常称为revinfo)创建变更集:
<createTable tableName="revinfo">
<column name="rev" type="integer">
<constraints primaryKey="true"/>
</column>
<column name="revtstmp" type="bigint"></column>
</createTable>
现在,我只需要添加带有rev和revtype列的名为tablename_AUD的新表(可以通过在我的实体@AuditTable(“new_name”)中添加新注释来更改此名称,但事实并非如此)。
这是我在liquibase中现有的表之一:
<createTable tableName="users">
<column name="id" type="int">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="email" type="varchar(200)">
<constraints unique="true" nullable="false"/>
</column>
<column name="first_name" type="varchar(60)">
<constraints nullable="false"/>
</column>
<column name="last_name" type="varchar(60)">
<constraints nullable="false"/>
</column>
</createTable>
这就是我的users_AUD的样子:
<createTable tableName="users_AUD">
<column name="id" type="bigint">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="rev" type="bigint">
<constraints referencedTableName="revinfo"
foreignKeyName="fk_users_AUD_revinfo"
referencedColumnNames="rev"
nullable="false"/>
</column>
<column name="revtype" type="smallint"/>
<column name="email" type="varchar(200)">
<constraints unique="true" nullable="false"/>
</column>
<column name="first_name" type="varchar(60)">
<constraints nullable="false"/>
</column>
<column name="last_name" type="varchar(60)">
<constraints nullable="false"/>
</column>
</createTable>
问题是:为什么我出现错误:
org.springframework.beans.factory.BeanCreationException:错误
在类路径中创建名称为“entityManagerFactory”的bean
资源
[org / springframework / boot / autoconfigure / orm / jpa / HibernateJpaAutoConfiguration.class]:
调用init方法失败;嵌套异常为
java.lang.NoClassDefFoundError:
org / hibernate / boot / registry / classloading / internal / ClassLoaderServiceImpl $ Work
我在pom中也添加了实体管理器的代理人身份,但这并不能解决我的问题。
先前称为:
这样的映射是可能的,但是必须使用
@Audited(targetAuditMode = NOT_AUDITED)
@ThomasEdwin的回答帮助了我。他说我们需要
add @Audited to all related entities.
或者像我注意到的那样,我们也可以在实体中进行注释
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED).
许多类似的问题已经过时了(之前配置/设置envers需要更多的工作,这就是我创建新问题的原因)。
更新:
在修复了版本等之后,最终应用程序运行了,但是当我尝试通过POST添加用户时,出现了如下错误:
https://pastebin.com/raw/d1vqY6xp
最佳答案
这种映射是可能的,但必须使用@Audited(targetAuditMode = NOT_AUDITED)进行明确定义。
您需要将@Audited
添加到所有相关实体。
编辑:
org.springframework.beans.factory.BeanCreationException:错误
在类路径中创建名称为“entityManagerFactory”的bean
资源
[org / springframework / boot / autoconfigure / orm / jpa / HibernateJpaAutoConfiguration.class]:
调用init方法失败;嵌套异常为
java.lang.NoClassDefFoundError:
org / hibernate / boot / registry / classloading / internal / ClassLoaderServiceImpl $ Work
这可能会有所帮助:Error creating bean with name 'entityManagerFactory' Invocation of init method failed。您需要确保休眠使用与@naros指出的版本相同的版本。