我是Hibernate Envers的新手,我试图生成审核表,但没有成功:( ...我正在使用hibernate-core-3.5.6-Final.jar
和hibernate-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控制台的错误消息。
关于两种方式中的问题在哪里?
答案 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中部署应用程序时自动生成了审计表
如果有人需要更多细节,请不要犹豫