2015-01-21 88 views
8

我們的Java應用程序是基於Spring的,我們有域類和通過Liquibase生成的相應模式。我可以使用Liquibase創建Hibernate Envers特定表格

我們計劃增加對單個域進行審計的支持。

a。我們沒有hibernate.xml和hibernate.cfg.xml,而是使用application-context.xml。那麼如何通過@Audited等註釋創建審計表。

我該如何解決這個問題?我在我的領域類

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

加入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註解,但是這種配置並沒有創造發展環境審計表。它不清楚我在這裏失去了什麼額外的配置。

b。我應該如何使用Liquibase創建必要的envers特定模式,生產團隊對於在生產環境中自動生成SQL模式的想法也不太自在。

+0

使用Envers時可以手動創建審計表。所以我想你需要添加配置到liquibase來創建這些表。 – Rohit 2015-01-21 06:31:11

+0

感謝您的回覆!如果我手動創建審計表,那麼在更新原始表中的任何字段時如何填充? – SST 2015-01-21 13:35:09

+1

您正在使用哪種Hibernate版本?使用4,你不需要任何特殊的配置來啓用審計,只需添加jar就足夠了。 – adamw 2015-01-22 08:00:59

回答

2

我在我們的項目中使用Hibernate,Envers和Liquibase。

解決envers添加到實體ExampleEntitity與db表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 adnotation到實體ExampleEntitity(或@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)如果你不希望審計相關實體)。

這就是全部。現在,實例ExampleEntitity的所有更改將存儲在表exampleEntitity_AUD中。

+0

如果您使用hibernate> = 4,則不需要手動執行任何操作。 – 2017-07-27 10:21:52

+1

@anujpradhan你能否詳細說明你的評論? Hibernate 4是否自動生成審計表? – Hervian 2017-11-19 13:53:52

相關問題