我们的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 {
但是此配置未在开发环境中创建审核表。目前尚不清楚我在这里缺少什么其他配置。
b。我应该如何使用Liquibase创建必要的envers特定模式,生产团队对于在生产环境中自动生成SQL模式的想法也不满意。
最佳答案
我在我们的项目中使用了Hibernate,Envers和Liquibase。
使用数据库表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>
您要审核的表exampleEntitity中的
id
,(...)
->字段。第二个,将
@Audited
注释添加到实体ExampleEntitity
(如果不想审核相关实体,则添加@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
)。就这样。现在,实例
ExampleEntitity
的所有更改将存储在表exampleEntitity_AUD
中。