Spring Data / JPA,Auditing,Envers ..history表缺少基表中的列

时间:2017-10-25 14:33:46

标签: hibernate junit spring-data spring-data-jpa hibernate-envers

我正在研究各种Spring Data功能并评估我们的应用程序。我从使用JpaRepository的简单JPA持久性和存储库方法的一些简单的JUnits测试(H2数据库)开始。然后我添加了一些具有创建和更新时间的表的审计以及使用JUnit测试的用户....到目前为止一直很好。

现在我正在尝试为某些表创建历史表。所以我完成了以下步骤:

  • 将spring-data-envers添加到pom.xml
  • 将EnableJPARepositories添加到SpringBootApplication @SpringBootApplication @EnableCaching @EnableJpaAuditing(modifyOnCreate =假) @EnableJpaRepositories(repositoryFactoryBeanClass = EnversRevisionRepositoryFactoryBean.class)

当我运行JUnits并查看生成的数据库时,我看到审计列(create user,create ts,update user,update ts不在历史表中,但它们位于基本实体表中。

所以我运行了一些额外的测试,我的基本实体扩展了一个包含审计列的抽象类。所以我可以为需要审计信息的所有实体重新用户。我将基本实体更改为不再扩展抽象审计类并添加审计属性和方法。现在历史表确实包含审计列。

因此,envers似乎没有查看实体层次结构来确定要添加到历史记录表的列。

思考?

2 个答案:

答案 0 :(得分:1)

我已经对基础实体使用了审计支持,因此它为审计表创建了所有列,包括基本实体列:

需要使用@Audited注释实体:

    @Audited
    @Table(name="exam_answer",schema="exam")
    public class ExamAnswer extends CoreEnt{}

带字段的基本实体:

@Audited
@MappedSuperclass
public abstract class CoreEnt {

    @Id
    @Access(AccessType.PROPERTY)
    @Column(name = "oid")
    private  String oid;
    @Column(name = "status")
    private String status;
    @Column(name = "created_date")
    private String createdDate;
    @Column(name = "updated_date")
    private String updatedDate;
    @Column(name="state")
    private Byte state; ....

我使用了带有spring数据jpa的hibernate envers。

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-envers</artifactId>
        <version>5.2.9.Final</version>
    </dependency>

添加了hibernate envers的属性:(我在java配置中设置它们也可以从application.properties设置)

protected Properties additionalProperties() {
    final Properties hibernateProperties = new Properties();
    hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
    hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
    hibernateProperties.setProperty("hibernate.default_schema", env.getProperty("hibernate.default_schema"));

    hibernateProperties.setProperty("org.hibernate.envers.default_schema", "audit");
    hibernateProperties.setProperty("org.hibernate.envers.audit_table_suffix", "_aud");

    hibernateProperties.setProperty("org.hibernate.envers.revision_field_name", "rev");
    hibernateProperties.setProperty("org.hibernate.envers.revision_type_field_name", "rev_type");
    hibernateProperties.setProperty("org.hibernate.envers.audit_strategy", "org.hibernate.envers.strategy.DefaultAuditStrategy");

    hibernateProperties.setProperty("org.hibernate.envers.use_revision_entity_with_native_id", "false");

    return hibernateProperties;
}

希望它有所帮助!

答案 1 :(得分:0)

我发现如果我用@Audited注释父类,那么这些列会出现在历史表中。