我可以使用 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<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
, (...)
-> exampleEntity 表中您要审核的字段。
第二,将@Audited
注解添加到实体ExampleEntitity
(或@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
,如果您不想审计相关实体)。
就是这样。现在实例ExampleEntitity
的所有更改都将存储在表exampleEntitity_AUD
中。
【讨论】:
如果您使用的是休眠>=4,则无需手动执行任何操作。 @anujpradhan 你能详细说明你的评论吗? Hibernate 4 会自动生成审计表吗?以上是关于我可以使用 Liquibase 创建 Hibernate Envers 特定表吗的主要内容,如果未能解决你的问题,请参考以下文章