configuraçao do hibernate com log4j

Salve galera do guj, estou com um probleminha aqui na configuraçao do hibernate com o log4j, acabei de fazer meu primeiro teste com hibernate, fiquei uns 2 dias procurando tutoriais (inclusive tem um post meu logo abaixo), consegui configurar certinho, estou conseguindo persistir na minha tabela e tudo mais, o problema ocorre quando eu tento incluir o log4j na minha aplicaçao, tava vendo uns tutoriais e fiz certinho, porem ocorre um Warn na minha aplicaçao. Abaixo estao os codigos que eu usei:

persistence.xml

<?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 name="">
  <property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver
</property>
  <property name="hibernate.connection.url">jdbc:mysql://localhost/hello
</property>
  <property name="hibernate.connection.username">root</property>
  <property name="hibernate.connection.password"></property>
  <mapping class="com.User"/>
 </session-factory>
</hibernate-configuration>

log4j.properties

# Sample ResourceBundle properties file  
  
### direct log messages to stdout ###  
log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
log4j.appender.stdout.Target=System.out  
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n  
  
### set log levels - for more verbose logging change 'info' to 'debug' ###  
  
log4j.rootLogger=debug, stdout  
  
log4j.logger.org.hibernate=info  
#log4j.logger.org.hibernate=debug  
  
### log HQL query parser activity  
#log4j.logger.org.hibernate.hql.ast.AST=debug  
  
### log just the SQL  
log4j.logger.org.hibernate.SQL=debug  
  
### log JDBC bind parameters ###  
log4j.logger.org.hibernate.type=info  
  
### log schema export/update ###  
log4j.logger.org.hibernate.tool.hbm2ddl=info  
  
### log HQL parse trees  
#log4j.logger.org.hibernate.hql=debug  
  
### log cache activity ###  
log4j.logger.org.hibernate.cache=info  
  
### log transaction activity  
#log4j.logger.org.hibernate.transaction=debug  
  
### log JDBC resource acquisition  
#log4j.logger.org.hibernate.jdbc=debug  
  
### enable the following line if you want to track down connection ###  
### leakages when using DriverManagerConnectionProvider ###  
#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace

ConexaoHibernate

package conexao;

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

public class ConexaoHibernate {
	private static final SessionFactory sessionFactory;
	
	private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
	
	static{
			try{
				sessionFactory = new Configuration().configure("persistence.xml").buildSessionFactory();
			} catch (Throwable e) {
				throw new ExceptionInInitializerError(e);
			}
	}
	
	public static Session getInstance() {
		return sessionFactory.openSession();

	}
	
	
}

User

package com;
 
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
 
@Entity
@Table(name="user")
public class User {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;
 
    @Column
    private String name;
 
    @Column
    private String password;
 
    @Override
    public boolean equals(Object obj) {
        if(obj instanceof User){
            User user = (User) obj;
            return user.getId() == this.getId();
        }
 
        return false;
    }
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getPassword() {
        return password;
    }
 
    public void setPassword(String password) {
        this.password = password;
    }
}

UserDAO

package dao;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.User;

import conexao.ConexaoHibernate;

public class UserDAO {
	private Session session;
	
	public void salvar(User user) {
		session = ConexaoHibernate.getInstance();
		Transaction tx = null;
		
		try{
			tx = session.beginTransaction();
			session.save(user);
			tx.commit();
		} catch(Exception e) {
			e.printStackTrace();
			tx.rollback();
		} finally {
			session.close();
		}
		
	}
}

Main

package com;
 
import dao.UserDAO;
 
public class Main {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
    	
    	User user = new User();
    	user.setName("Gustavo Torquato");
    	user.setPassword("123");
    	UserDAO udao = new UserDAO();
    	udao.salvar(user);
    }
}

O erro que ocorre aparece no meu terminal:

10:12:07,679  INFO Version:37 - Hibernate Commons Annotations 3.2.0.Final
  10:12:07,687  INFO Environment:603 - Hibernate 3.6.8.Final
  10:12:07,688  INFO Environment:636 - hibernate.properties not found
  10:12:07,691  INFO Environment:814 - Bytecode provider name : javassist
  10:12:07,695  INFO Environment:695 - using JDK 1.4 java.sql.Timestamp handling
  10:12:07,760  INFO Configuration:2156 - configuring from resource: persistence.xml
  10:12:07,760  INFO Configuration:2175 - Configuration resource: persistence.xml
  10:12:07,809  WARN DTDEntityResolver:73 - recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide!
  10:12:07,842  INFO Configuration:2297 - Configured SessionFactory: 
  10:12:07,896  INFO AnnotationBinder:532 - Binding entity from annotated class: com.User
  10:12:07,934  INFO EntityBinder:530 - Bind entity com.User on table user
  10:12:07,984  INFO Configuration:1676 - Hibernate Validator not found: ignoring
  10:12:07,988  INFO HibernateSearchEventListenerRegister:75 - Unable to find org.hibernate.search.event.FullTextIndexEventListener on the classpath. Hibernate Search is not enabled.
  10:12:07,995  INFO DriverManagerConnectionProvider:64 - Using Hibernate built-in connection pool (not for production use!)
  10:12:07,995  INFO DriverManagerConnectionProvider:65 - Hibernate connection pool size: 20
  10:12:07,996  INFO DriverManagerConnectionProvider:68 - autocommit mode: false
  10:12:08,003  INFO DriverManagerConnectionProvider:103 - using driver: org.gjt.mm.mysql.Driver at URL: jdbc:mysql://localhost/hello
  10:12:08,003  INFO DriverManagerConnectionProvider:109 - connection properties: {user=root, password=****}
  10:12:08,282  INFO Dialect:135 - Using dialect: org.hibernate.dialect.MySQLDialect
  10:12:08,293  INFO SettingsFactory:126 - Database ->
       name : MySQL
    version : 5.5.16
      major : 5
      minor : 5
  10:12:08,294  INFO SettingsFactory:132 - Driver ->
       name : MySQL-AB JDBC Driver
    version : mysql-connector-java-5.1.18 ( Revision: tonci.grgin@oracle.com-20110930151701-jfj14ddfq48ifkfq )
      major : 5
      minor : 1
  10:12:08,296  INFO TransactionFactoryFactory:62 - Using default transaction strategy (direct JDBC transactions)
  10:12:08,297  INFO TransactionManagerLookupFactory:83 - No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
  10:12:08,297  INFO SettingsFactory:179 - Automatic flush during beforeCompletion(): disabled
  10:12:08,297  INFO SettingsFactory:183 - Automatic session close at end of transaction: disabled
  10:12:08,297  INFO SettingsFactory:190 - JDBC batch size: 15
  10:12:08,297  INFO SettingsFactory:193 - JDBC batch updates for versioned data: disabled
  10:12:08,298  INFO SettingsFactory:198 - Scrollable result sets: enabled
  10:12:08,298  INFO SettingsFactory:206 - JDBC3 getGeneratedKeys(): enabled
  10:12:08,298  INFO SettingsFactory:214 - Connection release mode: auto
  10:12:08,299  INFO SettingsFactory:238 - Maximum outer join fetch depth: 2
  10:12:08,299  INFO SettingsFactory:241 - Default batch fetch size: 1
  10:12:08,299  INFO SettingsFactory:245 - Generate SQL with comments: disabled
  10:12:08,299  INFO SettingsFactory:249 - Order SQL updates by primary key: disabled
  10:12:08,299  INFO SettingsFactory:253 - Order SQL inserts for batching: disabled
  10:12:08,299  INFO SettingsFactory:431 - Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
  10:12:08,302  INFO ASTQueryTranslatorFactory:47 - Using ASTQueryTranslatorFactory
  10:12:08,302  INFO SettingsFactory:261 - Query language substitutions: {}
  10:12:08,302  INFO SettingsFactory:266 - JPA-QL strict compliance: disabled
  10:12:08,302  INFO SettingsFactory:271 - Second-level cache: enabled
  10:12:08,302  INFO SettingsFactory:275 - Query cache: disabled
  10:12:08,302  INFO SettingsFactory:406 - Cache region factory : org.hibernate.cache.impl.NoCachingRegionFactory
  10:12:08,303  INFO SettingsFactory:285 - Optimize cache for minimal puts: disabled
  10:12:08,303  INFO SettingsFactory:294 - Structured second-level cache entries: disabled
  10:12:08,308  INFO SettingsFactory:323 - Statistics: disabled
  10:12:08,308  INFO SettingsFactory:327 - Deleted entity synthetic identifier rollback: disabled
  10:12:08,308  INFO SettingsFactory:343 - Default entity-mode: pojo
  10:12:08,308  INFO SettingsFactory:347 - Named query checking : enabled
  10:12:08,308  INFO SettingsFactory:351 - Check Nullability in Core (should be disabled when Bean Validation is on): enabled
  10:12:08,324  INFO SessionFactoryImpl:202 - building session factory
  10:12:08,336  INFO BasicTypeRegistry:150 - Type registration [blob] overrides previous : org.hibernate.type.BlobType@88e2dd
  10:12:08,336  INFO BasicTypeRegistry:150 - Type registration [java.sql.Blob] overrides previous : org.hibernate.type.BlobType@88e2dd
  10:12:08,336  INFO BasicTypeRegistry:150 - Type registration [wrapper_characters_clob] overrides previous : org.hibernate.type.CharacterArrayClobType@e64686
  10:12:08,336  INFO BasicTypeRegistry:150 - Type registration [clob] overrides previous : org.hibernate.type.ClobType@203c31
  10:12:08,336  INFO BasicTypeRegistry:150 - Type registration [java.sql.Clob] overrides previous : org.hibernate.type.ClobType@203c31
  10:12:08,336  INFO BasicTypeRegistry:150 - Type registration [materialized_clob] overrides previous : org.hibernate.type.MaterializedClobType@4fc156
  10:12:08,337  INFO BasicTypeRegistry:150 - Type registration [materialized_blob] overrides previous : org.hibernate.type.MaterializedBlobType@1e2ca7
  10:12:08,337  INFO BasicTypeRegistry:150 - Type registration [characters_clob] overrides previous : org.hibernate.type.PrimitiveCharacterArrayClobType@105bd58
  10:12:08,337  INFO BasicTypeRegistry:150 - Type registration [wrapper_materialized_blob] overrides previous : org.hibernate.type.WrappedMaterializedBlobType@1d1e730
  10:12:08,536  INFO SessionFactoryObjectFactory:109 - Factory name: 
  10:12:08,537  INFO NamingHelper:49 - JNDI InitialContext properties:{}
  10:12:08,540  WARN SessionFactoryObjectFactory:121 - Could not bind factory to JNDI
  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.getNameParser(InitialContext.java:480)
	at org.hibernate.util.NamingHelper.bind(NamingHelper.java:75)
	at org.hibernate.impl.SessionFactoryObjectFactory.addInstance(SessionFactoryObjectFactory.java:113)
	at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:367)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)
	at conexao.ConexaoHibernate.<clinit>(ConexaoHibernate.java:14)
	at dao.UserDAO.salvar(UserDAO.java:14)
	at com.Main.main(Main.java:16)
10:12:08,597 DEBUG SQL:111 - insert into user (name, password) values (?, ?)

Como eu falei, o registro é inserido no banco, porem ocorre este Warn.
Outra coisa que gostaria de pedir a voces é em relaçao ao meu codigo, estou fazendo certinho, tem algo que esqueci de fazer, ou uma boa pratica de programaçao que deveria seguir?, quem tiver um tutorial de configuraçao do log4j, por favor me passe.

ESTOU USANDO JAVA DESKTOP E NAO WEB, ou seja nao tenho nenhum servidor tipo jboss, tomcat e tals.

Muito Obrigado pessoal

Será que seu problema não é essa configuração vazia?

Nao sei responder a questao do log4j mas quanto as boas praticas esta tudo certinho! Tem somente um ponto com relacao a JPA. Vocẽ esta usando-a apenas parcialmente nas suas annotations a JPA mas na hora de instanciar voce esta chamando diretamente o hibernate. O ideal seria usar as interfaces da propria JPA. Mais isso é um detalhe minimo…voce só vai ter que se preocupar com isso se quiser seguir a risca as boas praticas E manter as suas apps o mais FLEXIVEIS possivel…

edit: de qualquer maneira seguem alguns detalhes de como usar a JPA com hibernate corretamente na propria documentacao do hibernate: http://docs.jboss.org/hibernate/core/3.6/quickstart/en-US/html/hibernate-gsg-tutorial-jpa.html

Opa, obrigado carlos.e.a, quanto ao log4j, consegui resolver (Nao me perguntem como, kkkk), apenas refiz o codigo, fui olhando em outros sites, e li toda a documentaçao do log4j, aprendi como se configura e tals, vou postar o codigo logo mais. Agora com relaçao as boas praticas, como assim usar as proprias interfaces do JPA?, pelo que vi, eu teria que criar uma classe DAO para chamar o metodo save(), e entao pela minha classe de controle, eu instanciava um objeto DAO acessando seus metodos, nao sei se estou certo, mas se nao estiver, me explique por favor. Ate pouco tempo atras, usava o PreparedStatement, puro sofrimento, faz 2 dias que comecei a usar o hibernate, alem de meu professor ter me dado uma ideia errada do que era modelo mvc, quando comecei a pesquisar certinho, vi que o que eu fazia antes nao tinha nada a ver, entao to aprendendo. Posta ai uma dica como eu posso melhorar essa minha classe e usar, como vc disse as proprias interfaces do JPA.

Muito obrigado por me responder.

[quote=gustavotorquato]Opa, obrigado carlos.e.a, quanto ao log4j, consegui resolver (Nao me perguntem como, kkkk), apenas refiz o codigo, fui olhando em outros sites, e li toda a documentaçao do log4j, aprendi como se configura e tals, vou postar o codigo logo mais. Agora com relaçao as boas praticas, como assim usar as proprias interfaces do JPA?, pelo que vi, eu teria que criar uma classe DAO para chamar o metodo save(), e entao pela minha classe de controle, eu instanciava um objeto DAO acessando seus metodos, nao sei se estou certo, mas se nao estiver, me explique por favor. Ate pouco tempo atras, usava o PreparedStatement, puro sofrimento, faz 2 dias que comecei a usar o hibernate, alem de meu professor ter me dado uma ideia errada do que era modelo mvc, quando comecei a pesquisar certinho, vi que o que eu fazia antes nao tinha nada a ver, entao to aprendendo. Posta ai uma dica como eu posso melhorar essa minha classe e usar, como vc disse as proprias interfaces do JPA.

Muito obrigado por me responder.[/quote]

Entendi…voce começou agora entao blz vou tentar ser mais claro:

A JPA basicamente é uma especificacao com algumas interfaces predefinidas. Entao voce deveria usar essas interfaces ao inves da implementacao que no caso seria o hibernate. Ao fazer isso se um dia voce decidir trocar pra outra implementacao, por exemplo TopLink, voce nao precisaria mudar praticamente nada no codigo. Voce esta usando a JPA inconcientemente ao criar o persistence.xml pq ele faz parte da especificacao. No hibernate o nome nativo do arquivo de configuracao é hibernate.cfg.xml. Alias, voce poderia fazer o teste: se voce renomear esse teu arquivo pra hibernate.cfg.xml voce poderia perfeitamente chamar o Configuration.configure() sem argumentos que iria funcionar.

Outro ponto que voce usa a JPA inconcientemente é na parte dos seus imports de anotacao.

import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table;

Todos esses imports fazem parte da JPA.

Porem da forma que esta sendo feito no seu codigo de conexao (ConexaoHibernate) voce perde toda a “magica” da JPA. O ideal seria usar as interfaces da JPA(entityManagerFactory, EntityManager) que sao muito parecidas com a SessionFactory e Session do hibernate.

So para ilustrar pra ficar mais claro pra voce:

Nessa parte do seu codigo:

[code]public static Session getInstance() {
return sessionFactory.openSession();

} [/code]

Usando a JPA seria:

public static EntityManager getInstance(){ return entityManagerFactory.createEntityManager(); // Essa referencia entityManagerFactory equivale a sua sessionFactory e foi criada atraves da JPA, estou omitindo o codigo... Quando voce der uma lida na } //especificacao vai entender do que to falando.

Entao se um belo dia voce decide trocar de implementacao porque tal outra implementacao se tornou mais rapida ou o hibernate se tornou pago, sei la, nao importa…Qual seria a alteracao nesse codigo? Nenhuma…Voce so iria modificar o seu xml e mapea-lo para a outra implementacao.
)
Voce pode se perguntar: ha, nunca voi mudar de implementacao entao isso nao importa. Ai é que mora o problema. Tenho pelo menos duas grandes vantagens de usar a JPA(fora a independencia de implementacao):

1 - Se voce algum dia pegar um projeto que ja esta em andamento e ele estiver usando outra implementacao que nao o hibernate, muito provavelmente ela estara usando JPA, ou seja, voce nao vai perder tempo aprendendo especificidades da implementacao pq ela estara seguindo o padrao da JPA.

2 - As IDEs fornecem suporte a JPA e nao para uma implementacao X. Ou seja, voce pode criar uma entidade de conexao com banco e gerencia-la diretamente de dentro da IDE.No NetBeans por exemplo voce tem a aba de serviços onde tem as suas conexoes com o banco, seus servidores de aplicacao, servlet containers como o tomcat, etc. Ta tudo la de forma bem intuitiva e voce pode fazer alteracoes sem sequer abrir o xml.

Espero que tenha entendido a ideia. Qualquer outra duvida estamos ai!

Caramba cara, otima explicação, bom, no meio da minha “jornada”, vi varios codigos, inclusive estes que vc falou: (entityManagerFactory, EntityManager), usei, e funcionou perfeitamente, porem, em varios outros sites, o pessoal falava do SessionFactory, entao comecei a usalo, a respeito do arquivo xml, enquanto procurava tutoriais a respeito do log4j refiz as minhas classes, assim como tinha falado no post anterior, e usei o SessionFactory e o arquivo hibernate.cfg.xml e a implementaçao normal do hibernate. Porem estava usando sem saber como funcionava. Quando vc falou das implementaçoes do JPA, comecei a ligar os pontos e entendi como funciona tudo, mais uma vez, muito obrigado. Vou postar agora um mini tutorial de como eu fiz para funcionar o hibernate no meu projeto java Desktop, vou colocar uns comentarios tambem, para ajudar quem ta procurando a mesma coisa.

Mais uma vez, muito Obrigado!. :smiley:

[quote=gustavotorquato]Caramba cara, otima explicação, bom, no meio da minha “jornada”, vi varios codigos, inclusive estes que vc falou: (entityManagerFactory, EntityManager), usei, e funcionou perfeitamente, porem, em varios outros sites, o pessoal falava do SessionFactory, entao comecei a usalo, a respeito do arquivo xml, enquanto procurava tutoriais a respeito do log4j refiz as minhas classes, assim como tinha falado no post anterior, e usei o SessionFactory e o arquivo hibernate.cfg.xml e a implementaçao normal do hibernate. Porem estava usando sem saber como funcionava. Quando vc falou das implementaçoes do JPA, comecei a ligar os pontos e entendi como funciona tudo, mais uma vez, muito obrigado. Vou postar agora um mini tutorial de como eu fiz para funcionar o hibernate no meu projeto java Desktop, vou colocar uns comentarios tambem, para ajudar quem ta procurando a mesma coisa.

Mais uma vez, muito Obrigado!. :smiley: [/quote]

Poste mesmo pq eu serei um que ira ler pq nao manjo de log4j e esses dias estava querendo aprender mas acabei desistindo por nao encontrar referencias(admito que procurei pouco mas como tenho muita coisa pra estudar ainda acabei deixando meio que de molho). Quando postar se possivel coloca um link aqui e tambem nao esquece de colocar as suas referencias(as que voce considerou melhores) quanto ao log4j. Valeu.

Depois de dois dias intensos de batalhas, procurando como usar o hibernate e o log4j em um projeto java Swing (JAVA SE), ai vai as minhas classes e dicas de como proceder:

Primeiramente baixem o arquivo que eu coloquei para download, ele contem todas as bibliotecas que vocês vão precisar:
http://www.mediafire.com/?uar9gkqiykafe1k

Agora o arquivo SQL para criação do banco de dados, lembrando que usei o mysql
obs: Esse banco é ridiculamente ridiculo, kkk, nao me xinguem, pois fiz apenas para testar.
http://www.mediafire.com/?oe22anu1cmrlt0r

  • Usei o Eclipse para testar este projeto, então, criei um projeto e adicionei os seguintes pacotes: controle,negocio,persistencia.
  • Coloquei a pasta lib (Para baixar na UrL acima) dentro do meu projeto, fora da pasta src.
  • Logo depois adicionem todos os arquivos jar que estao dentro da pasta lib ao seu projeto
  • O primeiro arquivo que criei foi o hibernate.cfg.xml, este arquivo vai ficar dentro da pasta src, porem fora dos pacotes

hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/CadPessoa</property>
		<property name="hibernate.connection.username">UsuarioDoBanco</property>
		<property name="hibernate.connection.password">SenhaDoBanco</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="show_sql">false</property>
		<mapping class="negocio.Pessoa"/>
	</session-factory>
</hibernate-configuration> 

Obs: onde esta escrito “negocio.Pessoa”, é o nome da classe que vc vai mapear.

  • Logo em seguida eu criei o meu arquivo de configuração do log4j, esse arquivo, assim como o hibernate.cfg.xml, ficara dentro da pasta src, porem fora dos pacotes.

log4j.properties

## Existem 5 niveis de log, sao eles:
## DEBUG, INFO, WARN, ERROR e FATAL Obs: Necessariamente nessa ordem, onde DEBUG é o nivel mais baixo
## Nós podemos configurar categorias para cada nivel de log
## Por exemplo, posso falar que os logs do tipo ERROR vao ser exibidos no console e enviados par ao banco
## Podemos falar tambem que o nivel de log WARN sera exibido no console e enviado para um arquivo txt



## Criando categoria de log default.
## Esta categoria é padrao para o sistema, como se fosse um usuario root
## Vou falar que a categoria rootCategory vai gravar erros a partir do nivel ERROR no console, em um arquivo e no banco de dados
## Os nomes: arquivo,console,banco sao aletorios, voce escolhe, mas de preferencia para nomes dentro do contexto
log4j.rootCategory=ERROR,arquivo,console,banco


## Criando categoria para a classe PessoaDAO
## Se voce quiser, pode criar uma categoria para tudo, porem, para explicar melhor eu crio varias categorias
## Vou falar que a categoria PessoaDAO vai gravar erros a partir do nivel INFO no console e no arquivo
log4j.category.PessoaDAO=INFO,console,arquivo


## Criando categoria PessoaDAO2 (Não encontrei um nome melhor, kkk)
## Vou falar que a categoria PessoaDAO2 vai gravar erros a partir do nivel DEBUG apenas no console
log4j.category.PessoaDAO2=DEBUG,console


## Depois que criamos as nossa categorias, vamos criar os appenders, sao esses caras que vao gravar os logs
## no console, no arquivo ou no banco
## Lembre-se do nome que voce deu na criaçao das categorias



##Primeiro appender escreve no console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n


##Segundo appender escreve em um arquivo
log4j.appender.arquivo=org.apache.log4j.RollingFileAppender
## Na proxima linha, coloco o nome do arquivo como gustavolog.log, ele ira criar este arquivo na raiz do meu projeto na pasta logs
log4j.appender.arquivo.File=logs/gustavolog.log
log4j.appender.arquivo.MaxFileSize=100KB
log4j.appender.arquivo.MaxBackupIndex=1
log4j.appender.arquivo.layout=org.apache.log4j.PatternLayout
log4j.appender.arquivo.layout.ConversionPattern=%-2d{dd/MM/yy HH:mm} [%t] %5p %c:%L \u2013 %m%n


##Terceiro appender escreve no banco
log4j.appender.banco=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.banco.driver=com.mysql.jdbc.Driver
log4j.appender.banco.URL=jdbc:mysql://127.0.0.1:3306/CadPessoa
log4j.appender.banco.user=AQUI VAI O USUARIO DO BANCO, SEM ASPAS
log4j.appender.banco.password=AQUI VAI A SEHNA DO BANCO, SEM ASPAS, SE NAO TIVER SENHA, DEIXA VAZIO MESMO
log4j.appender.banco.layout=org.apache.log4j.PatternLayout
## Aqui vai o comando para inserir no banco
## Quanto aos padroes que coloquei, por exemplo: %5p, procurem na internet, pois nem eu sei todos
log4j.appender.banco.sql=INSERT INTO log VALUES(now(),"%5p", "%m%n", "(%F:%L)")


## Categoria para o hibernate;
## Nesse caso ele vai escrever no console a saida do sql do hibernate a partir do nivel DEBUG
log4j.category.org.hibernate.SQL=DEBUG,console
  • Logo em seguida criei minha classe Conexao, onde vou instanciar o meu objeto SessionFactory para abrir uma sessao com o banco de dados, Esta classe tambem é chamada por muitos, de FABRICA DE CONEXÕES, de acordo com o que eu pesquisei.

Conexao

package persistencia;

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

public class Conexao {
	private static final SessionFactory sessionFactory;
	
	//private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
	
	static{
			try{
				sessionFactory = new Configuration().configure().buildSessionFactory();
			} catch (Throwable e) {
				throw new ExceptionInInitializerError(e);
			}
	}
	
	public static Session getInstance() {
		return sessionFactory.openSession();

	}
}
  • Criamos agora a classe Pessoa, Não vou falar dos anotations, pois ainda estou aprendendo e nao sei a fundo, porem sei que serve para falar qual tabela aquela classe esta mapeando e quais campos da tabela cada atributo da classe esta representando, inclusive a primary key.

Pessoa

package negocio;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="pessoa") // Esse cara representa o nome da tabela
public class Pessoa {
	
	@Id //a primary key da tabela
	@GeneratedValue(strategy=GenerationType.AUTO) //o tipo da primary key, nesse caso, auto increment
	private int id;
	
	@Column //Campo da tabela
	private String name;
	
	@Column //Campo da tabela
	private String password;

	
	
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
}
  • Agora criamos o nosso arquivo PessoaDAO

PessoaDAO

package persistencia;

import org.apache.log4j.Logger;

import negocio.Pessoa;

import org.hibernate.Session;
import org.hibernate.Transaction;

public class PessoaDAO {
	private Session session;
	
	// Vejam este proximo objeto, é ele que faz os logs, agora repare no atributo que passo dentro do metodo
	// getLogger, lembram do arquivo log4j.properties, onde eu falei das categorias?, pois entao, é ai que entram
	// Poderia colocar a categoria PessoaDAO2, que os logs so iriam aparecer se fossem DEBUG, e apenas no console
	public Logger logger = Logger.getLogger("PessoaDAO");
	
	public void salvar(Pessoa pessoa) {
		session = Conexao.getInstance();
		Transaction tx = null;
		
		logger.info("Iniciando Aplicação"); // Coloco um log do tipo INFO
		logger.debug("Debugando aplicação"); // Coloco um log do tipo DEBUG, 
		
		try{
			tx = session.beginTransaction();
			session.save(pessoa);
			tx.commit();
			
			logger.info("usuario salvo no banco com sucesso"); // Coloco um log do tipo Info
			// Esse logs sao otimos pois nao precisa usar os printStackTrace, assim como usei ai abaixo, 
			// E as mensagens de saida dos logs sao bem formatadas de facil entendimento
		} catch(Exception e) {
			e.printStackTrace();
			tx.rollback();
		} finally {
			session.close();
		}
	}
}
  • E finalmente a nossa classe Main, lembrando que do jeito que eu fiz é errado, o certo era criar uma outra classe de controle e colocar os metodos, deixar o Main apenas para iniciar a aplicação, mas para nao perder muito tempo, ( e um pouquinho de preguiça, kkk), coloquei no main mesmo.
package controle;
 
import persistencia.PessoaDAO;
import negocio.Pessoa;
 
public class Main {
 
    public static void main(String[] args) {
    	
    	Pessoa user = new Pessoa();
    	user.setName("Gustavo Torquato da costa");
    	user.setPassword("123456779");
    	PessoaDAO udao = new PessoaDAO();
    	udao.salvar(user);
    }
}

Bom pessoal, fiquei dois dias procurando pra caramba, pra conseguir fazer isso, usava ainda o prepared statement, sofria pra caramba. Essas classes estao bem simples, e gostaria que se alguem conseguisse melhora-las, me avisem, e tambem se eu estiver fazendo algo de errado é só dar uma bronca, estou aqui pra aprender mesmo. Qualquer duvida, é so postar, terei o prazer de ajudar, muito obrigado.

Alteração:::

Pessoal, cometi um errinho, kkk, normal.
dentro do arquivo log4j.properties falei que as categorias exibiam logs do nivel indicado para cima, porem é ao contrario, eles exibem logs do nivel indicado para baixo, entao, se eu colocar uma categoria com nivel FATAL, ele exibe todas as outras categorias, porem se eu colocar uma categoria com nivel INFO, os logs que serao exibidos terao o nivel INFO e DEBUG, qualquer duvida é so falar.

Pessoal esqueci de colocar as referencias:
http://javafree.uol.com.br/artigo/874971/Acessando-Dados-com-Java-Parte-3-Hibernate-Annotations.html
http://www.plugin.com.br/ajuda/pergunta/137/como-utilizar-a-ferramenta-biblioteca-log4j
http://blog.camilolopes.com.br/configurando-log4j-em-seus-projetos-java/
http://nodesign.wordpress.com/2007/11/06/java-hibernate-configurando/
http://diegocalazans.com/

Pessoal, to testando aqui, vejo que o log esta sendo gravado duas vezes, pois coloquei no log4j.properties a categoria rootCategory para gravar no banco, no console e no arquivo, esta categoria é geral, ou seja independe das outras categorias e exibe todos os logs do sistema, ainda nao sei como alterar isso, consegui resolver apenas alterando a linha onde tem:
log4j.rootCategory=ERROR,arquivo,console,banco para
log4j.rootCategory=ERROR

Se alguem tiver alguma dica, so falar.

Valeu gustavotorquato. Vou dar uma lida com calma amanha pq hoje to saindo…domingo “sacomé né” =D

Quanto ao MySQL, sinceramente nao considero um DB ruim nao…obviamente nao se compara a um Oracle da vida mas quebra um galho…Ao meu ver quem faz um DB uma carroça ou um jato é o DBA. Já vi DB com chave de 8 atributos. Ai ja viu… =D