我可以使用 Liquibase 创建 Hibernate Envers 特定表吗

Posted

技术标签:

【中文标题】我可以使用 Liquibase 创建 Hibernate Envers 特定表吗【英文标题】:Can I create Hibernate Envers specific tables using Liquibase 【发布时间】:2015-03-19 12:37:03 【问题描述】:

我们的 Java 应用是基于 Spring 的,我们有域类和通过 Liquibase 生成的相应架构。

我们计划添加对要审核的单个域的支持。

一个。我们没有 hibernate.xml 和 hibernate.cfg.xml,而是使用 application-context.xml。那么如何通过@Audited 等注解创建审计表。

我该如何解决这个问题?我已将休眠配置添加为

<property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.mysqlInnoDBDialect</prop>
                <prop key="hibernate.ejb.event.post-insert">org.hibernate.ejb.event.EJB3PostInsertEventListener,org.hibernate.envers.event.AuditEventListener</prop>
                <prop key="hibernate.ejb.event.post-update">org.hibernate.ejb.event.EJB3PostUpdateEventListener,org.hibernate.envers.event.AuditEventListener</prop>
                <prop key="hibernate.ejb.event.post-delete">org.hibernate.ejb.event.EJB3PostDeleteEventListener,org.hibernate.envers.event.AuditEventListener</prop>
                <prop key="hibernate.ejb.event.pre-collection-update">org.hibernate.envers.event.AuditEventListener</prop>
                <!-- <prop key="hibernate.ejb.event.pre-collection-remove">org.hibernate.envers.event.AuditEventListener</prop>
                <prop key="hibernate.ejb.event.post-collection-recreate">org.hibernate.envers.event.AuditEventListener</prop> -->
                <prop key="org.hibernate.envers.revision_field_name">REV</prop>
                <prop key="org.hibernate.envers.revision_type_field_name">REVTYPE</prop>
                <prop key="org.hibernate.envers.auditTablePrefix"></prop>
                <prop key="org.hibernate.envers.auditTableSuffix">_AUD</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>

在我的域类中添加了@Audited 注释

@Entity
@Audited
@Table(name="user")
public class User implements Serializable 

但是这个配置并没有在开发环境中创建审计表。不清楚我在这里缺少什么额外的配置。

b.我应该如何使用 Liquibase 创建必要的特定环境架构,生产团队对在生产环境中自动生成 SQL 架构的想法并不满意。

【问题讨论】:

您可以在使用 Envers 时手动创建审核表。所以我想你需要向 liquibase 添加配置来创建这些表。 感谢您的回复!!如果我手动创建审计表,那么在更新原始表中的任何字段时如何填充? 您使用的是哪个 Hibernate 版本?使用 4,你不需要任何特殊的配置来启用审计,只需添加 jar 就足够了。 我们使用的是休眠版本:3.6.3.Final 【参考方案1】:

我在我们的项目中使用 Hibernate、Envers 和 Liquibase。

使用 db table exampleEntitity 将 envers 添加到实体 ExampleEntitity 的解决方案(仅表,如果它是简单实体并且我们不审计关系):

首先,添加到liquibase&lt;changeSet&gt;标签例如:

<changeSet author="Gal" id="createExampleEntitity_AUD">
    <createTable tableName="exampleEntitity_AUD">
        <column name="id" type="BIGINT">
            <constraints nullable="false"/>
        </column>
        <column name="REV" type="BIGINT">
            <constraints nullable="false"/>
        </column>
        <column name="REVTYPE" type="SMALLINT"/>
        (...)
    </createTable>
</changeSet>

<changeSet author="Gal" id="primaryKeyExampleEntitity_AUD">
    <addPrimaryKey columnNames="id, REV" tableName="exampleEntitity_AUD"/>
</changeSet>

<changeSet author="Gal" id="fkExampleEntitity_AUD_revisionsTable">
    <addForeignKeyConstraint baseColumnNames="REV" baseTableName="exampleEntitity_AUD" 
        constraintName="FK_revisions_exampleEntitity_AUD" 
        deferrable="false" initiallyDeferred="false" 
        onDelete="NO ACTION" onUpdate="NO ACTION" 
        referencedColumnNames="id" referencedTableName="revisionsTable"/>
</changeSet>

id, (...) -> exampleEntity 表中您要审核的字段。

第二,将@Audited注解添加到实体ExampleEntitity(或@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED),如果您不想审计相关实体)。

就是这样。现在实例ExampleEntitity的所有更改都将存储在表exampleEntitity_AUD中。

【讨论】:

如果您使用的是休眠>=4,则无需手动执行任何操作。 @anujpradhan 你能详细说明你的评论吗? Hibernate 4 会自动生成审计表吗?

以上是关于我可以使用 Liquibase 创建 Hibernate Envers 特定表吗的主要内容,如果未能解决你的问题,请参考以下文章

Liquibase 使用 Postgis“几何”类型创建表

liquibase hsql db列创建错误

Flyway 或 Liquibase 可以生成更新脚本而不是直接更新数据库吗?

MS-SQL Liquibase - 无法创建连接

如何使用 liquibase 更改架构名称

创建索引时的 Liquibase 缓慢