首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring数据/ JPA,审核,从基表中加入缺少列的..history表

Spring数据/ JPA,审核,从基表中加入缺少列的..history表
EN

Stack Overflow用户
提问于 2017-10-25 14:33:46
回答 2查看 2.4K关注 0票数 0

我正在研究各种Spring数据特性,并对我们的应用程序进行评估。我从使用JpaRepository和存储库方法的一些简单JUnits测试(H2数据库)开始使用简单的JPA持久性。然后,我添加了一些对一些表的审计,这些表的创建和更新时间和用户使用JUnit tests....so都非常好。

现在,我正试图为其中一些表创建一个历史表。所以我走了几步

  • 在pom.xml中添加了spring-data-envers
  • 将EnableJPARepositories添加到SpringBootApplication @SpringBootApplication @EnableCaching @EnableJpaAuditing(modifyOnCreate=false) SpringBootApplication=EnversRevisionRepositoryFactoryBean.class中

当我运行我的JUnits并查看生成的数据库时,我看到审计列(create、create、update、update )不在历史表中,而是在基本实体表中。

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

因此,envers似乎不会通过实体层次结构来确定要添加到历史表中的列。

有什么想法?

EN

回答 2

Stack Overflow用户

发布于 2017-11-02 00:15:54

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

需要用@Audited注释实体:

代码语言:javascript
复制
    @Audited
    @Table(name="exam_answer",schema="exam")
    public class ExamAnswer extends CoreEnt{}

具有字段的基本实体:

代码语言:javascript
复制
@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。

代码语言:javascript
复制
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-envers</artifactId>
        <version>5.2.9.Final</version>
    </dependency>

为hibernate envers添加了属性:(我通过java配置设置了它们,也可以通过application.properties设置它们)

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-10-25 14:54:07

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46935197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档