使用ant和hibernate envers创建审计表

时间:2015-05-04 10:48:33

标签: hibernate ant hibernate-envers

我是Hibernate Envers的新手,我试图生成审核表,但没有成功:( ...我正在使用hibernate-core-3.5.6-Final.jarhibernate-envers-3.5.6-Final.jar

我的第一次尝试是在我的hbm2ddl.auto

中创建直接审核表,将update属性设置为hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
...
    <property name="hbm2ddl.auto">update</property>
    <property name="hibernate.ejb.event.post-insert">org.hibernate.ejb.event.EJB3PostInsertEventListener,org.hibernate.envers.event.AuditEventListener</property>
    <property name="hibernate.ejb.event.post-update">org.hibernate.ejb.event.EJB3PostUpdateEventListener,org.hibernate.envers.event.AuditEventListener</property>
    <property name="hibernate.ejb.event.post-delete">org.hibernate.ejb.event.EJB3PostDeleteEventListener,org.hibernate.envers.event.AuditEventListener</property>
    <property name="hibernate.ejb.event.pre-collection-update">org.hibernate.envers.event.AuditEventListener</property>
    <property name="hibernate.ejb.event.pre-collection-remove">org.hibernate.envers.event.AuditEventListener</property>
    <property name="hibernate.ejb.event.post-collection-recreate">org.hibernate.envers.event.AuditEventListene</property>
...
 </session-factory>

我的审计课程如下:

@Entity
@Audited
@Table(name = "EAL_USUS_USUARIOS", uniqueConstraints = @UniqueConstraint(columnNames = {
    "BIC_ENTIDAD", "ID_INTERNO_ENTIDAD" }))
public class EalUsusUsuarios implements java.io.Serializable {

但是update命令会忽略audity表,所以我尝试创建一个ant任务来生成一个schema ddl文件,所以在我的build.xml文件中有一个类似的任务:

<target name="schemaexport" description="Exports a generated schema to DB and file">
    <echo message="generación schema "/>
  <taskdef name="hibernatetool" classname="org.hibernate.tool.ant.EnversHibernateToolTask"
    classpath="${CK_JARS}/hibernate-envers-3.5.6-Final.jar"/>
 <hibernatetool destdir="${clases.dir}">
    <classpath>
      <fileset refid="hibernate-envers-3.5.6-Final.jar" />
      <path location="${CK_JARS}/" />
    </classpath>
    <jpaconfiguration persistenceunit="ConsolePU" />
    <hbm2ddl
      drop="false"
      create="true"
      export="false"
      outputfilename="C:/Desarrollo/versioning-ddl.sql"
      delimiter=";"
      format="true"/>
  </hibernatetool>
</target>

这个配置显然不起作用,因为我不确定应该在classpath中设置什么值。我虽然这是envers jar所在的目录,但我得到了一个“taskdef类org.hibernate.tool.ant.EnversHibernateToolTask所需的类:org/hibernate/tool/ant/HibernateToolTask”来自ant控制台的错误消息。

关于两种方式中的问题在哪里?

1 个答案:

答案 0 :(得分:0)

我会自己回答,希望能够为别人做好准备。

首先,我几乎疯狂地试图配置我的hibernate.cfg.xml以便能够使用envers。最后我放弃了这个选项,然后迁移到JPA 2.0。要设置jpa配置,必须在persistence.xml目录中设置WEB-INF/classes/META-INF。就我而言,这个档案如下:

?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence             
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="****" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:/jdbc/EaliaPagosDTSource</jta-data-source>
<class>es.cecabank.ealiapagos.accesobd.model.EalUsusMediospEsts</class>
<class>es.cecabank.ealiapagos.accesobd.model.EalUsusAliasEsts</class> 
...
<properties>
    <!-- property name="javax.persistence.transactionType"
   value="RESOURCE_LOCAL" /-->
    <property name="hibernate.bytecode.use_reflection_optimizer" value="false"/>
    <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
    <property name="javax.persistence.jdbc.password" value="****"/>
    <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:********"/>
    <property name="javax.persistence.jdbc.user" value="****"/>
    <property name="javax.persistence.jdbc.default_schema" value="****"/>
    <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
    <property name="hibernate.show_sql" value="true"/>
    <property name="hibernate.dialect"  value="org.hibernate.dialect.Oracle9iDialect"/>
    <property name="hibernate.search.autoregister_listeners" value="false" />
    <property name="hibernate.current_session_context_class" value="thread"/>
    <property name="show_sql" value="true"/>
    <property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>

请注意,我正在为transation-type配置JTA。这非常重要,因为您管理事务的方式取决于此值。在我的例子中,我使用在<jta-data-source>标签中定义的数据源的事务,它指的是在JBOSS配置文件standalone.xml中声明的数据源。我使用@Audited注释标记了我的实体,并且在我在JBOSS 7.1中部署应用程序时自动生成了审计表

如果有人需要更多细节,请不要犹豫