Hibernate Envers não criando e nem salvando tabelas de Auditoria ( Resolvido )

Boa noite pessoal !
Comecei a ler hoje sobre o Envers.

Estou um problema, configurei as minhas classes mas quando faço um insert…ele não cria a segunda tabela ou inseri os dados nela
Segue código abaixo

hibernate.cfg

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property  name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>   
<property name="hibernate.dialect"> org.hibernate.dialect.MySQLMyISAMDialect</property>    
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/teste</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">senha</property>
        <property name="hibernate.hbm2dll.auto">update</property> 
        <property name="hibernate.show_sql">true</property>
        
        <listener class="org.hibernate.envers.event.AuditEventListener" type="post-insert"/>   
        <listener class="org.hibernate.envers.event.AuditEventListener" type="post-update"/>   
        <listener class="org.hibernate.envers.event.AuditEventListener" type="post-delete"/>   
        <listener class="org.hibernate.envers.event.AuditEventListener" type="pre-collection-update"/>   
        <listener class="org.hibernate.envers.event.AuditEventListener" type="pre-collection-remove"/>   
        <listener class="org.hibernate.envers.event.AuditEventListener" type="post-collection-recreate"/>
 
    </session-factory>
</hibernate-configuration>

Usuario


import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import org.hibernate.envers.AuditTable;
import org.hibernate.envers.Audited;


@Entity
@Audited
@AuditTable("historico")
public class Usuario implements Serializable {   
      
    @Id  
    @GeneratedValue  
    private Long id;  
    private String login;  
    private String senha;

      
      
    public Long getId() {  
        return id;  
    }  
    public void setId(Long id) {  
        this.id = id;  
    }  
    public String getLogin() {  
        return login;  
    }  
    public void setLogin(String login) {  
        this.login = login;  
    }  
    public String getSenha() {  
        return senha;  
    }  
    public void setSenha(String senha) {  
        this.senha = senha;  
    }  
  
}  

Gerar tabela



import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;


public class GerarTabela {
  public static void main(String[] args) {
AnnotationConfiguration cfg = new AnnotationConfiguration();
cfg.addAnnotatedClass(Usuario.class);
cfg.configure();
SchemaExport se = new SchemaExport(cfg);
se.create(true, true);
}
}

Adiciona


import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;


public class Adiciona {

    public static void main(String[] args) {
        Usuario u = new Usuario();
        u.setLogin("FELIPE");
        u.setSenha("123");
        AnnotationConfiguration cfg = new AnnotationConfiguration();
        cfg.addAnnotatedClass(Usuario.class);
        cfg.configure();
        SessionFactory factory = cfg.buildSessionFactory();
        Session session = factory.openSession();
        session.beginTransaction();
        session.save(u);
        session.close();
    }
}

Saida da execução

run:
00:09:13  INFO [Version             ] Hibernate Annotations 3.5.0-Final
00:09:13  INFO [Environment         ] Hibernate 3.5.0-Final
00:09:13  INFO [Environment         ] hibernate.properties not found
00:09:13  INFO [Environment         ] Bytecode provider name : javassist
00:09:13  INFO [Environment         ] using JDK 1.4 java.sql.Timestamp handling
00:09:13  INFO [Version             ] Hibernate Commons Annotations 3.2.0.Final
00:09:13  INFO [Configuration       ] configuring from resource: /hibernate.cfg.xml
00:09:13  INFO [Configuration       ] Configuration resource: /hibernate.cfg.xml
00:09:14  INFO [Configuration       ] Configured SessionFactory: null
00:09:14  INFO [HibernateSearchEventListenerRegister] Unable to find org.hibernate.search.event.FullTextIndexEventListener on the classpath. Hibernate Search is not enabled.
00:09:14  INFO [AnnotationBinder    ] Binding entity from annotated class: Usuario
00:09:14  INFO [EntityBinder        ] Bind entity Usuario on table Usuario
00:09:14  INFO [AnnotationConfiguration] Hibernate Validator not found: ignoring
00:09:14  INFO [DriverManagerConnectionProvider] Using Hibernate built-in connection pool (not for production use!)
00:09:14  INFO [DriverManagerConnectionProvider] Hibernate connection pool size: 20
00:09:14  INFO [DriverManagerConnectionProvider] autocommit mode: false
00:09:14  INFO [DriverManagerConnectionProvider] using driver: com.mysql.jdbc.Driver at URL: jdbc:mysql://localhost:3306/teste
00:09:14  INFO [DriverManagerConnectionProvider] connection properties: {user=root, password=****}
00:09:14  INFO [SettingsFactory     ] RDBMS: MySQL, version: 5.1.41
00:09:14  INFO [SettingsFactory     ] JDBC driver: MySQL-AB JDBC Driver, version: mysql-connector-java-5.0.7 ( $Date: 2007-03-09 22:13:57 +0100 (Fri, 09 Mar 2007) $, $Revision: 6341 $ )
00:09:14  INFO [Dialect             ] Using dialect: org.hibernate.dialect.MySQLMyISAMDialect
00:09:15  INFO [JdbcSupportLoader   ] Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
00:09:15  INFO [TransactionFactoryFactory] Using default transaction strategy (direct JDBC transactions)
00:09:15  INFO [TransactionManagerLookupFactory] No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
00:09:15  INFO [SettingsFactory     ] Automatic flush during beforeCompletion(): disabled
00:09:15  INFO [SettingsFactory     ] Automatic session close at end of transaction: disabled
00:09:15  INFO [SettingsFactory     ] JDBC batch size: 15
00:09:15  INFO [SettingsFactory     ] JDBC batch updates for versioned data: disabled
00:09:15  INFO [SettingsFactory     ] Scrollable result sets: enabled
00:09:15  INFO [SettingsFactory     ] JDBC3 getGeneratedKeys(): enabled
00:09:15  INFO [SettingsFactory     ] Connection release mode: auto
00:09:15  INFO [SettingsFactory     ] Maximum outer join fetch depth: 2
00:09:15  INFO [SettingsFactory     ] Default batch fetch size: 1
00:09:15  INFO [SettingsFactory     ] Generate SQL with comments: disabled
00:09:15  INFO [SettingsFactory     ] Order SQL updates by primary key: disabled
00:09:15  INFO [SettingsFactory     ] Order SQL inserts for batching: disabled
00:09:15  INFO [SettingsFactory     ] Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
00:09:15  INFO [ASTQueryTranslatorFactory] Using ASTQueryTranslatorFactory
00:09:15  INFO [SettingsFactory     ] Query language substitutions: {}
00:09:15  INFO [SettingsFactory     ] JPA-QL strict compliance: disabled
00:09:15  INFO [SettingsFactory     ] Second-level cache: enabled
00:09:15  INFO [SettingsFactory     ] Query cache: disabled
00:09:15  INFO [SettingsFactory     ] Cache region factory : org.hibernate.cache.impl.NoCachingRegionFactory
00:09:15  INFO [SettingsFactory     ] Optimize cache for minimal puts: disabled
00:09:15  INFO [SettingsFactory     ] Structured second-level cache entries: disabled
00:09:15  INFO [SettingsFactory     ] Echoing all SQL to stdout
00:09:15  INFO [SettingsFactory     ] Statistics: disabled
00:09:15  INFO [SettingsFactory     ] Deleted entity synthetic identifier rollback: disabled
00:09:15  INFO [SettingsFactory     ] Default entity-mode: pojo
00:09:15  INFO [SettingsFactory     ] Named query checking : enabled
00:09:15  INFO [SettingsFactory     ] Check Nullability in Core (should be disabled when Bean Validation is on): enabled
00:09:15  INFO [HbmBinder           ] Mapping class: Usuario_AUD -> historico
00:09:15  INFO [HbmBinder           ] Mapping class: org.hibernate.envers.DefaultRevisionEntity -> REVINFO
00:09:15  INFO [SessionFactoryImpl  ] building session factory
00:09:15  INFO [SessionFactoryObjectFactory] Not binding factory to JNDI, no JNDI name configured
Hibernate: insert into Usuario (login, senha) values (?, ?)
CONSTRUÍDO COM SUCESSO (tempo total: 3 segundos)

Muito obrigado pela ajuda ou alguma sugestão =p

Você está usando algum servidor de aplicação?

pela linha

00:09:15  INFO [SessionFactoryObjectFactory] Not binding factory to JNDI, no JNDI name configured  

você não configurou um JNDI (Datasource) e pode ser esse o problema.

Estou usando TomCat… então meu problema está em configurar o JNDI no arquivo context do TomCat?

Ou configure um datasource e não use JNDI.

Datasource acredito que seja a melhor solução, mas veja ai se funciona e nos avise!

o que é esse Envers?

[quote=fabiozanardi]Datasource acredito que seja a melhor solução, mas veja ai se funciona e nos avise!

o que é esse Envers?[/quote]

Utilizado para auditoria em banco de dados.

http://www.jboss.org/envers
http://docs.jboss.org/envers/docs/index.html

Opa consegui configurar o DataSource

Segue dica configurar o DataSource para quem tiver o mesmo problema:
/TomCat/conf/context.xml

inclua esse trecho de código antes do

<Resource
name="jdbc/testeBd"
type="javax.sql.DataSource"
username="root"
password="senha10"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3309/BancoDeDados"
maxActive="8"
maxIdle="4"/>

Arquivo Web-Inf/web.xml

<resource-ref>
  <description>Conexao MySQL</description>
  <res-ref-name>jdbc/TesteDB</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
</resource-ref>

no seu projeto, vá até o arquivo Meta-Inf/context.xml e inclua esse código:

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/Geliv">

    <Resource name="jdbc/testeBd" 
    auth="Container" 
    type="javax.sql.DataSource" 
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3309/BancodeDados"
    username="root"
    password="senha"/>
</Context>

Classe para teste se está funcionando:

<%@ page language="java" import="java.io.*, java.sql.*, 
                                 javax.naming.*, javax.sql.*" %>
<html>
<head><title>Aprendendo JSP</title>
</head>
<body>



<%
 InitialContext ctx = new InitialContext();
DataSource db = (DataSource)ctx.lookup("java:comp/env/jdbc/BancoDeDados");
Connection con = db.getConnection();
  
  if(con != null)
    out.println("Conexão efetuada com sucesso!");
%>

</body>
</html>

fabiozanardi
O Envers é uma ferramenta de Auditoria que se não me engano foo incluida a partir do Hibernate 3.5
Ainda vou testar ela, mas o que andei lendo, ela funciona mais ou menos assim:
Você tem uma aplicação de cadastro, e quer ter um histórico do que foi alterado, inserido ou excluido.
O Envers cria uma tabela identica a sua tabela de cadastro no seu Banco, e cada vez que você faz um insert, update ou delete na sua tabela de cadastro, o Envers automaticamente faz um insert na 2º tabela que seria o histórico.

Me corrijam se eu estiver errado.

Efetuei a configuração do DataSource conforme código acima, mas ainda continua criando somente uma tabela no banco =/

o erro permanece o mesmo?

Fiz uma pequena configuração no:
hibernate.cfg.xml acrescentando

 <property name="hibernate.connection.datasource">java:/comp/env/jdbc/teste</property>

        <property name="hibernate.current_session_context_class">thread</property>

        <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>

        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>

        <property name="hibernate.jdbc.batch_size">0</property>

o erro que está dando é:

3 [main] INFO org.hibernate.cfg.annotations.Version - Hibernate Annotations 3.5.6-Final
43 [main] INFO org.hibernate.cfg.Environment - Hibernate 3.5.6-Final
48 [main] INFO org.hibernate.cfg.Environment - hibernate.properties not found
56 [main] INFO org.hibernate.cfg.Environment - Bytecode provider name : javassist
68 [main] INFO org.hibernate.cfg.Environment - using JDK 1.4 java.sql.Timestamp handling
337 [main] INFO org.hibernate.annotations.common.Version - Hibernate Commons Annotations 3.2.0.Final
361 [main] INFO org.hibernate.cfg.Configuration - configuring from resource: /hibernate.cfg.xml
363 [main] INFO org.hibernate.cfg.Configuration - Configuration resource: /hibernate.cfg.xml
528 [main] INFO org.hibernate.cfg.Configuration - Configured SessionFactory: null
566 [main] INFO org.hibernate.cfg.search.HibernateSearchEventListenerRegister - Unable to find org.hibernate.search.event.FullTextIndexEventListener on the classpath. Hibernate Search is not enabled.
709 [main] INFO org.hibernate.cfg.AnnotationBinder - Binding entity from annotated class: Model.Usuario
826 [main] INFO org.hibernate.cfg.annotations.EntityBinder - Bind entity Model.Usuario on table Usuario
937 [main] INFO org.hibernate.cfg.AnnotationConfiguration - Hibernate Validator not found: ignoring
1073 [main] INFO org.hibernate.util.NamingHelper - JNDI InitialContext properties:{}
1084 [main] ERROR org.hibernate.connection.DatasourceConnectionProvider - Could not find datasource: java:/comp/env/jdbc/teste
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
	at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
	at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
	at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
	at javax.naming.InitialContext.lookup(InitialContext.java:392)
	at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:75)
	at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:143)
	at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:84)
	at org.hibernate.cfg.SettingsFactory.createConnectionProvider(SettingsFactory.java:438)
	at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:91)
	at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2163)
	at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2159)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1383)
	at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
	at Adiciona.main(Adiciona.java:18)
Exception in thread "main" org.hibernate.HibernateException: Could not find datasource
	at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:79)
	at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:143)
	at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:84)
	at org.hibernate.cfg.SettingsFactory.createConnectionProvider(SettingsFactory.java:438)
	at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:91)
	at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2163)
	at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2159)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1383)
	at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
	at Adiciona.main(Adiciona.java:18)
Caused by: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
	at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
	at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
	at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
	at javax.naming.InitialContext.lookup(InitialContext.java:392)
	at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:75)
	... 9 more
Java Result: 1

=/

Resolvi meu problema,
Acabei optando por mudar pelo JPA 2 e persistence.xml

Ai funcionou =D

Mas vi que tem gente que consegue usar o Envers com o hibernate.conf.xml =/

Consegui fazer sem usar JPA

faltava commitar a transação com

session.getTransaction().commit();

unica alteração que precisei fazer foi

Adiciona

    import Model.Usuario;  
    import javax.persistence.Persistence;  
    import org.hibernate.Session;  
    import org.hibernate.SessionFactory;  
    import org.hibernate.cfg.AnnotationConfiguration;  
    import org.hibernate.tool.hbm2ddl.SchemaExport;  
      
    public class Adiciona {  
      
        public static void main(String[] args) {  
          
            Usuario u = new Usuario();  
      
            u.setLogin("Felipe");  
            u.setSenha("2802");  
      
      
         
            AnnotationConfiguration cfg = new AnnotationConfiguration();  
            cfg.addAnnotatedClass(Usuario.class);  
            cfg.configure();  
            SessionFactory factory = cfg.buildSessionFactory();  
            Session session = factory.openSession();  
            session.save(u);  
            session.beginTransaction();  
            session.getTransaction().commit();  
      
            session.close();  
      
      
        }  
    }  

Classe Gerar Tabela

    import Model.Historico;  
    import Model.Usuario;  
    import org.hibernate.Session;  
    import org.hibernate.SessionFactory;  
    import org.hibernate.cfg.AnnotationConfiguration;  
    import org.hibernate.tool.hbm2ddl.SchemaExport;  
      
      
    public class GerarTabela {  
      
        public static void main(String[] args) {  
      
            AnnotationConfiguration cfg = new AnnotationConfiguration();  
            cfg.addAnnotatedClass(Usuario.class);  
            cfg.configure();  
            SessionFactory factory = cfg.buildSessionFactory();  
            Session session = factory.openSession();  
            session.beginTransaction();  
            session.getTransaction().commit();  
            SchemaExport se = new SchemaExport(cfg);  
            se.create(true, true);  
            session.close();  
      
        }  
    }