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

时间:2015-01-21 04:31:11

标签: java spring hibernate hibernate-envers

我们的Java应用程序是基于Spring的,我们有域类和通过Liquibase生成的相应模式。

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

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

如何解决此问题?我已将hibernate配置添加为

<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 {

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

湾如何使用Liquibase创建必要的envers特定模式,生产团队不熟悉在生产环境中自动生成SQL模式的想法。

1 个答案:

答案 0 :(得分:2)

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

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

首先,添加到liquibase <changeSet>标签,例如:

<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(...) - &gt;您要审核的表 exampleEntitity 中的字段。

第二次,将@Audited个注释添加到实体ExampleEntitity(如果您不想审核相关实体,则添加@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)。)

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

相关问题