gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:34:08 25 4
gpt4 key购买 nike

我们的 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 模式的想法不满意。

最佳答案

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

给实体添加envers的解决方案ExampleEntitity与数据库表 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 , (...) -> 表 exampleEntitity 中您要审核的字段。

其次,添加@Audited实体的注释 ExampleEntitity (或者 @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) 如果您不想审计相关实体)。

就是这样。现在实例的所有变化 ExampleEntitity将存储在表 exampleEntitity_AUD 中.

关于java - 我可以使用 Liquibase 创建 Hibernate Envers 特定表吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28059650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com