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:
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | private static final SessionFactory sessionFactory; private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); /* 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?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/livraria </property> <property name="hibernate.connection.username">camilo</property> <property name="hibernate.connection.password">integrator</property> <mapping class="br.com.bean.Pessoa"/> </session-factory> </hibernate-configuration> |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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



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.
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
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.
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,
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)
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,