我正在研究各种Spring Data功能并评估我们的应用程序。我从使用JpaRepository的简单JPA持久性和存储库方法的一些简单的JUnits测试(H2数据库)开始。然后我添加了一些具有创建和更新时间的表的审计以及使用JUnit测试的用户....到目前为止一直很好。
现在我正在尝试为某些表创建历史表。所以我完成了以下步骤:
当我运行JUnits并查看生成的数据库时,我看到审计列(create user,create ts,update user,update ts不在历史表中,但它们位于基本实体表中。
所以我运行了一些额外的测试,我的基本实体扩展了一个包含审计列的抽象类。所以我可以为需要审计信息的所有实体重新用户。我将基本实体更改为不再扩展抽象审计类并添加审计属性和方法。现在历史表确实包含审计列。
因此,envers似乎没有查看实体层次结构来确定要添加到历史记录表的列。
思考?
答案 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注释父类,那么这些列会出现在历史表中。