2015-01-21 4 views
8

Наше Java-приложение основано на Spring, и у нас есть классы домена и соответствующая схема, сгенерированная с помощью Liquibase.Могу ли я создать Hibernate Envers конкретные таблицы, используя Liquibase

Мы планируем добавить поддержку для отдельного домена, подлежащего аудиту.

a. У нас нет 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, а также в производственной среде.

+0

Вы можете вручную создать таблицы аудита при использовании Envers. Поэтому, я думаю, вам нужно добавить конфигурацию в Liquibase для создания этих таблиц. – Rohit

+0

Спасибо за ваш ответ !! Если я создаю таблицу аудита вручную, то как мне заполнить при обновлении любых полей в исходной таблице? – SST

+1

Какая версия Hibernate вы используете? С 4 вам не нужна специальная конфигурация для включения аудита, достаточно добавить банку. – adamw

ответ

2

Я использую в нашем проекте 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 adnotation к лицу ExampleEntitity (или @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) если вы не хотите провести аудит связанных лиц).

Это все. Теперь все изменения экземпляров ExampleEntitity будут сохранены в таблице exampleEntitity_AUD.

+0

Не нужно ничего делать вручную, если вы используете hibernate> = 4. –

+1

@anujpradhan Можете ли вы рассказать о своем комментарии? Создает ли Hibernate 4 автоматически таблицы аудита? – Hervian

Смежные вопросы