我的问题可能很简单,但是有关hibernate-envers的文档说,我只需要两个步骤就可以使hibernate-envers起作用:

  • 在类路径上的休眠envers jar
  • 实体上的@Audited批注。

  • 首先,我添加了:
    <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 {...}
    

    经过这两个步骤,我可以选择:
  • 使用hbm2ddl工具
  • 生成自动模式
  • 单独创建模式。

  • 教程/文档等中的许多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指出的版本相同的版本。

    09-16 07:20