views:

2162

answers:

4

I have Hibernate working and would like to try adding Envers audit/revision functionality but can't seem to figure out what is required. (my example compiles and runs OK and I get the regular Hibernate functionality but no audit tables appear in my database.) Has someone out there done this before? Does it work with H2 database using HSQLDB dialect? Is there a simple and complete example program on the web?

edit: let me rephrase slightly. In the end, I'd like my build process to create a .jar file, that I can install on a different computer, and with the appropriate .properties file and JDBC driver, will create (or allow me to create) the appropriate database tables if they are not already present. How can I do this?

edit: well so far, if I want to run the ant task that Jamie B has suggested, I have to tweak my classpath so it finds the envers jar file and the hibernate-tools jar file that is buried inside the Hibernate tools zip. And I still haven't gotten things working. If/when I do, I think maybe then I can create an SQL file and put it as a resource within my final .jar file, that then I can use from within my program itself. (although a red flag goes off in my head thinking about security issues... hmm....)

+1  A: 

Did you read Chapter 6 of the Reference Document (www.jboss.org/file-access/default/members/envers/downloads/envers-1.2.0.ga-hibernate-3.3.pdf)? Looks like the _AUD tables do not get created in the standard Hibernate way; there's an AntTask that augments it.

Jamie Bisotti
where the @#%@%# is org.hibernate.tool.ant.HibernateToolTask found????
Jason S
A: 

I have the same problem. It's ANT a requirement in order that Envers works??

+2  A: 

It sounds like you are looking for the following hibernate property:

hibernate.hbm2ddl.auto

From the documentation:

Automatically validate or export schema DDL to the database when the SessionFactory is created.

This automatically creates the schema tables named according to the envers properties you've set. No additional libraries or ant tasks needed.

I, for example, add this to my hibernate.cfg.xml set to update for my development databases. You can also add this property programatically using Hibernate's configuration object.

qbn
A: 

Hi!

after some experiments I've got working table generation with envers

I used these parameter hibernate.hbm2ddl.auto=create-drop

error appears because table exists, so I think, that parameter hibernate.hbm2ddl.auto=update will solve it

Log:

    5755 [main] INFO org.hibernate.cfg.HbmBinder - Mapping class: myappcompany.base.Company_AUD -> company_AUD
5782 [main] INFO org.hibernate.cfg.HbmBinder - Mapping class: org.hibernate.envers.DefaultRevisionEntity -> REVINFO
5915 [main] INFO org.hibernate.impl.SessionFactoryImpl - building session factory
6746 [main] INFO org.hibernate.impl.SessionFactoryObjectFactory - Not binding factory to JNDI, no JNDI name configured
6784 [main] INFO org.hibernate.tool.hbm2ddl.SchemaExport - Running hbm2ddl schema export
6785 [main] INFO org.hibernate.tool.hbm2ddl.SchemaExport - exporting generated schema to database
9004 [main] ERROR org.hibernate.tool.hbm2ddl.SchemaExport - Unsuccessful: create table company (ID bigint not null auto_increment, CREATED datetime, CREATED_BY varchar(255), MODIFIED datetime, MODIFIED_BY varchar(255), NAME varchar(255) not null, primary key (ID))
9004 [main] ERROR org.hibernate.tool.hbm2ddl.SchemaExport - Table 'company' already exists
10227 [main] INFO org.hibernate.tool.hbm2ddl.SchemaExport - schema export complete

my config:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd"&gt;

    <!--
    Data Source config 
     -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
     destroy-method="close" p:driverClassName="${jdbc.driver}" p:url="${jdbc.url}"
     p:username="${jdbc.username}" p:password="${jdbc.password}" />

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
     p:entity-manager-factory-ref="entityManagerFactory" />

    <!-- 
    JPA config   
    -->
    <tx:annotation-driven />

    <bean id="entityManagerFactory"
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
     p:persistence-xml-location="${persistence.xml.location}"
     p:data-source-ref="dataSource">
     <property name="jpaVendorAdapter">
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
       p:showSql="true" p:generateDdl="true">
      </bean>
     </property>
     <property name="jpaProperties">
      <value>
       hibernate.ejb.naming_strategy=org.hibernate.cfg.DefaultNamingStrategy
       hibernate.dialect=${hibernate.dialect}
       hibernate.hbm2ddl.auto=${hibernate.hbm2ddl.auto}
      </value>
     </property>
    </bean>

    <bean
     class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
</beans>

At few days I'll make a full example

ziftech
thanks for the post -- this issue is so far down my task queue that I'm not sure I'll have time to look at it anytime soon, but I really appreciate it -- I had to abandon the envers approach because I just didn't have time to figure out how to get it to work.
Jason S
so maybe you use an alternative approach? if it so, could you share it? I think it'll be helpful
ziftech