Java Básico + Hibernate JPA + Mysql


olá Pessoal,
Recebi alguns emails pedindo para criar um post mais puro com Hibernate + JPA, ou seja, sem o uso de JSF. Atendendo aos pedidos, montei um post bem simples, onde vamos criar a nossa velha classe Java com o método main e armazenar as informações em um BD (MySql) tendo o Hibernate como framework de persitencia. Entao se você deseja dar os primeiros passos usando os frameworks: Hibernate + JPA para persistencia de dados nao deixe de ler o post a seguir.
Lets go..
Outros posts.
– JSF + Hibernate + MySql no Eclipse
– Hibernate Annotations + JSF + MySql
– Busca com Hibernate Annotation + JSF
Atenção: Não apresentarei como criar um DB ou configurar o Hibernate no Eclipse. Qualquer dúvida consulte um dos posts acima. Vou considerar que você já tem um ambiente de desenvolvimento pronto para entrar em ação.
Dados do DataBase:

  • Crie um DataBase (usarei uma chamada livraria)
  • crie uma tabela (usarei uma tabela com o nome camilo )
  • Dados da tabela: id(auto_increment), nome(varchar), cidade(varchar)
  • Preparação do projeto
    1.Crie um o Java Project no Eclipse com o nome que achar conveniente.
    2.Agora crie uma estrutura de packages conforme a imagem a seguir

    3.Adicione os arquivos .jars do mysql, hibernate + JPA ao projeto. Clique com o botão direito no projeto escolha Properties e depois clique em JavaBuild. Na tela que aparece clique em Add external jars. (Caso nao tenha uma Library para os .jars )

    Desenvolvimento/Teste
    1.Agora crie uma classe Java com nome de Pessoa no package br.com.bean.

    package br.com.bean;
    /*se os arquivos .jars nao estiver no projeto
     * nao será possivel encontrar os imports
     */
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Table;
    @Entity
    @Table(name="camilo")
    public class Pessoa {
    	
    	private String nome; 
    	private String cidade; 
    	@Id
    	int id;
    	public String getNome() {
    		return nome;
    	}
    	public void setNome(String nome) {
    		this.nome = nome;
    	}
    	public String getCidade() {
    		return cidade;
    	}
    	public void setCidade(String cidade) {
    		this.cidade = cidade;
    	}
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	
    }

    2.Crie uma classe ConexaoHibert.java no package br.com.conexao

    private static final SessionFactory sessionFactory;
    	private static final ThreadLocal threadLocal = 
    		new ThreadLocal();
    	/* observe o que temos de importante 
    	 * nesse bloco static, o arquivo
    	 * que possui os dados de conexao com 
    	 * o banco de dados hibernateconfig.xml 
    	 */
    	static{
    		try{
    			sessionFactory = new  AnnotationConfiguration().
    			configure("hibernateconfig.xml")
    			.buildSessionFactory();
    		
    		}catch (Throwable e) {
    			throw new ExceptionInInitializerError(e);
    		}
    	}
    	//retorna uma sessao de comunicacao com o BD
    	public static Session getInstance(){
    		Session session = (Session) threadLocal.get();
    		session = sessionFactory.openSession();
    		threadLocal.set(session);
    		return session;
    	} 

    3.Crie uma class PessoaDAO no package br.com.hibernatedao

    package br.com.hibernatedao;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    
    import br.com.bean.Pessoa;
    import br.com.conexao.ConexaoHibert;
    
    public class PessoaDAO {
    	private Session session;
    	
    	public void Salvar(Pessoa p){
    		//obtem uma sessao
    		session = ConexaoHibert.getInstance();
    		Transaction tx = null; //permite transacao com o BD 
    		
    		try{
    			tx = session.beginTransaction();
    			session.save(p);
    			tx.commit();//faz a transacao
    		}catch (Exception e) {
    			e.printStackTrace();
    			//cancela a transcao em caso de falha
    			tx.rollback();
    		}finally{
    			session.close();
    		}}}
    

    4.Agora crie uma arquivo .xml em source conforme o code abaixo:

    
    
    
     
      org.gjt.mm.mysql.Driver
    
      jdbc:mysql://localhost/livraria
    
      camilo
      integrator
      
     
    
    

    Fique atento aos nomes usado na class Pessoa.java para fazer anotação. Veja que eu tenho o nome da tabela no BD diferente do nome da minha class Java (fiz de proposito). Então somos obrigado a definir o name da tabela, caso contrario a JPA vai considerar o nome da classe.
    5.Agora crie uma classe no package br.com.teste com o nome de PessoaTest.java.

    package br.com.teste;
    
    import br.com.bean.Pessoa;
    import br.com.hibernatedao.PessoaDAO;
    
    public class PessoaTest {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		Pessoa p = new Pessoa(); 
    		p.setNome("mel"); 
    		p.setCidade("Salvador");
    		PessoaDAO pdao = new PessoaDAO(); 
    			pdao.Salvar(p);	}}
    

    6.Salve e execute a classe PessoaTest.java e verifique se os dados foram inseridos no BD.

    Pronto!Bem simples não? E menos cansativo que usar o velho padrão DAO. Espero que tenham gostado do post. Abracos e até o proximo post…


    Follow me: http://twitter.com/camilolope

    6 comentários em “Java Básico + Hibernate JPA + Mysql”

    1. E ai meu amigo todo bem…

      Estou com um probleminha chato com o Hibernate… Literalmente fiz o CRTL+C e CTRL+V.

      E esta dando o seguinte erro:
      2 [main] INFO org.hibernate.cfg.annotations.Version – Hibernate Annotations 3.4.0.GA
      23 [main] INFO org.hibernate.cfg.Environment – Hibernate 3.3.0.SP1
      28 [main] INFO org.hibernate.cfg.Environment – hibernate.properties not found
      32 [main] INFO org.hibernate.cfg.Environment – Bytecode provider name : javassist
      37 [main] INFO org.hibernate.cfg.Environment – using JDK 1.4 java.sql.Timestamp handling
      121 [main] INFO org.hibernate.annotations.common.Version – Hibernate Commons Annotations 3.1.0.GA
      125 [main] INFO org.hibernate.cfg.Configuration – configuring from resource: hibernateconfig.xml
      125 [main] INFO org.hibernate.cfg.Configuration – Configuration resource: hibernateconfig.xml
      Exception in thread “main” java.lang.ExceptionInInitializerError
      at br.com.conexao.ConexaoHibernat.(ConexaoHibernat.java:23)
      at br.com.hiberntedao.PessoaDAO.Salvar(PessoaDAO.java:14)
      at br.com.teste.PessoaTest.main(PessoaTest.java:16)
      Caused by: org.hibernate.HibernateException: hibernateconfig.xml not found
      at org.hibernate.util.ConfigHelper.getResourceAsStream(ConfigHelper.java:170)
      at org.hibernate.cfg.Configuration.getConfigurationInputStream(Configuration.java:1439)
      at org.hibernate.cfg.Configuration.configure(Configuration.java:1461)
      at org.hibernate.cfg.AnnotationConfiguration.configure(AnnotationConfiguration.java:1017)
      at br.com.conexao.ConexaoHibernat.(ConexaoHibernat.java:19)
      … 2 more

      Será que vc pode me dar um help.. Falow Grande abraço.

      1. parece ser problemas de versao, vc está usando versoes compativeis dos seus arquivos .jar? e outro erro que ele nao encontrou seu arquivo de configuracao do hibernate, observe que o erro eh bem auto-explicativo. Eu no seu lugar baixava o hibernate nao versao beta e a versao jpa. Em um dos meus posts eu coloquei os arquivos ja para download exatos que precisa ter em lib, dar uma olhada ai no blog

    2. Ola Camilo tdb?
      Amei o artigo muito simples… eu fiz deu certo.. porém preciso de um exemplinho deste tipo focado para web usando hibernate e vraptor você pode me ajudar…

      Obrigada
      []s,
      Maira Fonseca.

      1. olá Maira,
        Obrigado pelo feedback Aqui no blog tem com JSF. Para vraptor eu nao tenho. Até pq nunca trabalhei com o framework, mas se vc aprendeu o vraptor é só adaptar. Eu acredito que no site do vraptor e na apostila dele o pessoal da caelum tem falado sobre o assunto.

        abracos,

    3. Olá Camilo.
      Gostei do seu exemplo testei no NetBeans e funcionou, gravou no BD,
      só que ele gera um erro que eu não sei o que é, se puder ajudar. Segue abaixo o erro.

      19/12/2011 13:42:59 org.hibernate.cfg.annotations.Version
      INFO: Hibernate Annotations 3.3.1.GA
      19/12/2011 13:42:59 org.hibernate.cfg.Environment
      INFO: Hibernate 3.2.5
      19/12/2011 13:42:59 org.hibernate.cfg.Environment
      INFO: hibernate.properties not found
      19/12/2011 13:42:59 org.hibernate.cfg.Environment buildBytecodeProvider
      INFO: Bytecode provider name : cglib
      19/12/2011 13:42:59 org.hibernate.cfg.Environment
      INFO: using JDK 1.4 java.sql.Timestamp handling
      19/12/2011 13:42:59 org.hibernate.cfg.Configuration configure
      INFO: configuring from resource: hibernateconfig.xml
      19/12/2011 13:42:59 org.hibernate.cfg.Configuration getConfigurationInputStream
      INFO: Configuration resource: hibernateconfig.xml
      19/12/2011 13:42:59 org.hibernate.cfg.Configuration doConfigure
      INFO: Configured SessionFactory:
      19/12/2011 13:42:59 org.hibernate.cfg.AnnotationBinder bindClass
      INFO: Binding entity from annotated class: br.com.bean.Pessoa
      19/12/2011 13:42:59 org.hibernate.cfg.annotations.EntityBinder bindTable
      INFO: Bind entity br.com.bean.Pessoa on table camilo
      19/12/2011 13:42:59 org.hibernate.cfg.AnnotationConfiguration secondPassCompile
      INFO: Hibernate Validator not found: ignoring
      19/12/2011 13:42:59 org.hibernate.connection.DriverManagerConnectionProvider configure
      INFO: Using Hibernate built-in connection pool (not for production use!)
      19/12/2011 13:42:59 org.hibernate.connection.DriverManagerConnectionProvider configure
      INFO: Hibernate connection pool size: 20
      19/12/2011 13:42:59 org.hibernate.connection.DriverManagerConnectionProvider configure
      INFO: autocommit mode: false
      19/12/2011 13:42:59 org.hibernate.connection.DriverManagerConnectionProvider configure
      INFO: using driver: com.mysql.jdbc.Driver at URL: jdbc:mysql://localhost/livraria
      19/12/2011 13:42:59 org.hibernate.connection.DriverManagerConnectionProvider configure
      INFO: connection properties: {user=li, password=****}
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory buildSettings
      INFO: RDBMS: MySQL, version: 5.5.11
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory buildSettings
      INFO: JDBC driver: MySQL-AB JDBC Driver, version: mysql-connector-java-5.1.13 ( Revision: ${bzr.revision-id} )
      19/12/2011 13:42:59 org.hibernate.dialect.Dialect
      INFO: Using dialect: org.hibernate.dialect.MySQLDialect
      19/12/2011 13:42:59 org.hibernate.transaction.TransactionFactoryFactory buildTransactionFactory
      INFO: Using default transaction strategy (direct JDBC transactions)
      19/12/2011 13:42:59 org.hibernate.transaction.TransactionManagerLookupFactory getTransactionManagerLookup
      INFO: No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory buildSettings
      INFO: Automatic flush during beforeCompletion(): disabled
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory buildSettings
      INFO: Automatic session close at end of transaction: disabled
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory buildSettings
      INFO: JDBC batch size: 15
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory buildSettings
      INFO: JDBC batch updates for versioned data: disabled
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory buildSettings
      INFO: Scrollable result sets: enabled
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory buildSettings
      INFO: JDBC3 getGeneratedKeys(): enabled
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory buildSettings
      INFO: Connection release mode: auto
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory buildSettings
      INFO: Maximum outer join fetch depth: 2
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory buildSettings
      INFO: Default batch fetch size: 1
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory buildSettings
      INFO: Generate SQL with comments: disabled
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory buildSettings
      INFO: Order SQL updates by primary key: disabled
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory buildSettings
      INFO: Order SQL inserts for batching: disabled
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory createQueryTranslatorFactory
      INFO: Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
      19/12/2011 13:42:59 org.hibernate.hql.ast.ASTQueryTranslatorFactory
      INFO: Using ASTQueryTranslatorFactory
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory buildSettings
      INFO: Query language substitutions: {}
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory buildSettings
      INFO: JPA-QL strict compliance: disabled
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory buildSettings
      INFO: Second-level cache: enabled
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory buildSettings
      INFO: Query cache: disabled
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory createCacheProvider
      INFO: Cache provider: org.hibernate.cache.NoCacheProvider
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory buildSettings
      INFO: Optimize cache for minimal puts: disabled
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory buildSettings
      INFO: Structured second-level cache entries: disabled
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory buildSettings
      INFO: Statistics: disabled
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory buildSettings
      INFO: Deleted entity synthetic identifier rollback: disabled
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory buildSettings
      INFO: Default entity-mode: pojo
      19/12/2011 13:42:59 org.hibernate.cfg.SettingsFactory buildSettings
      INFO: Named query checking : enabled
      19/12/2011 13:42:59 org.hibernate.impl.SessionFactoryImpl
      INFO: building session factory
      19/12/2011 13:42:59 org.hibernate.impl.SessionFactoryObjectFactory addInstance
      INFO: Factory name:
      19/12/2011 13:42:59 org.hibernate.util.NamingHelper getInitialContext
      INFO: JNDI InitialContext properties:{}
      19/12/2011 13:42:59 org.hibernate.impl.SessionFactoryObjectFactory addInstance
      AVISO: 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:52)
      at org.hibernate.impl.SessionFactoryObjectFactory.addInstance(SessionFactoryObjectFactory.java:90)
      at org.hibernate.impl.SessionFactoryImpl.(SessionFactoryImpl.java:306)
      at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1294)
      at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859)
      at br.com.conexao.ConexaoHibert.(ConexaoHibert.java:26)
      at br.com.hibernatedao.PessoaDAO.Salvar(PessoaDAO.java:14)
      at br.com.teste.PessoaTest.main(PessoaTest.java:23)

      1. olá Miguel,
        Na verdade tu n teve error, e sim warn/aviso. Veja o nome do JNDI que vc deu se está correto. é questão de configuração mesmo.

        abracos,

    Deixe um comentário

    O seu endereço de e-mail não será publicado.