Olá, tudo bom? Como vão vocês?
Embora meus artigos sobre JPA 2.0 tenham uma sequencia, este em especial está sendo postado para sanar as dúvidas de vários leitores que me pediram para ensiná-los a usar o Hibernate 3.5, como ORM provider, para trabalhar com JPA 2.0.
Dúvidas e críticas são bem vindas.
Preparação do ambiente de trabalho
Se você olhou o artigo JPA na Prática – Parte 1, será similar no banco de dados e na ferramenta porém, haverá uma modificação na biblioteca JPA.
A biblioteca JPA
O Hibernate é um ORM como o EclipseLink, muito utilizado no desenvolvimento Web com Java, cujo a versão 3.5 possui suporte a Java Persistence API 2.0. Você pode baixá-la clicando aqui. Clique em Download, no menu lateral esquerdo.
A versão, no momento em que escrevo, é a 3.5.0-CR-2 (ainda em desenvolvimento).
Os arquivos que terá de baixar serão:
- Hibernate Core
- Hibernate JPAModelGen
Ao baixar os arquivos, descompacte-os. Você precisará das seguintes bibliotecas:
- hibernate3.jar
- antlr-2.7.6.jar
- commons-collections-3.1.jar
- dom4j-1.6.1.jar
- javassist-3.9.0.GA.jar
- jta-1.1.jar
- slf4j-api-1.5.8.jar
- hibernate-jpa-2.0-api-1.0.0-CR-1.jar
Além destes arquivos, será necessário utilizar as bibliotecas da Simple Logging Facade for Java, SLF4J. Baixe o arquivo com todas as bibliotecas da SLF4J aqui.
Descompacte o arquivo após baixá-lo. Você precisará das seguintes bibliotecas:
- slf4j-jdk14-1.5.11.jar
- slf4j-log4j12-1.5.11.jar
O Projeto
O projeto para este pequeno tutorial é o mesmo do criado no artigo JPA na Prática – Parte 1, portanto não será explicado novamente como fazê-lo.
As bibliotecas no projeto
Podemos tanto criar uma biblioteca de usuário, contendo todas elas ou, simplesmente, adicionar todas ao seu projeto.
Configurando o arquivo persistence.xml
Similar ao mostrado na JPA 2.0 na Prática – Parte 2, no arquivo persistence.xml, altere-o conforme a Listagem 1 abaixo:
Listagem 1 – O arquivo persistence.xml
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="JpaNaPratica" transaction-type="RESOURCE_LOCAL"> <class>br.com.integrator.Categoria</class> <properties> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpapratica"></property> <property name="javax.persistence.jdbc.user" value="edson"></property> <property name="javax.persistence.jdbc.password" value="integrator"></property> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"></property> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.format_sql" value="true" /> <property name="hibernate.hbm2ddl.auto" value="create"/> </properties> </persistence-unit> </persistence>
Infelizmente, nem todas as propriedades de persistence.xml são padronizadas, conforme já dito no artigo JPA na Prática – Parte 2. Para exibir a saída das instruções SQL geradas, assim como outras informações, as seguintes propriedades foram adicionadas ao arquivo persistence.xml:
<property name="hibernate.show_sql" value="true" /> <property name="hibernate.format_sql" value="true" />
Para criar a tabela, utilizamos a seguinte adição:
<property name=”hibernate.hbm2ddl.auto” value=”create”/>
Testando o Projeto
Similar ao mostrado na JPA 2.0 na Prática – Parte 2, execute a classe com o método main() e veja os resultados refletidos no banco de dados.
Hibernate ou EclipseLink?
Muitos me perguntam isso, querendo saber qual é o melhor. O ideal, como sempre, é conhecer ambos e tirar as suas próprias conclusões. Em JPA 2.0, ao menos por enquanto, no que foi mostrado, não há diferença.
Abraço a todos e até o próximo artigo.
março 10th, 2010 8:40
Muito Bom Edson!!
Uma pergunta em alguns tutoriais vi um mapeamento do provedor
vc acha mesmo necessario?
março 10th, 2010 9:07
@Matheu,
Se está se referindo a determinação do provider, Hibernate ou EclipseLink, não é mais necessário na JPA 2.0.
março 11th, 2010 15:07
Olá Edson,
então a linha:
org.eclipse.persistence.jpa.PersistenceProvider
não precisa mais ser declarada?
Então o que muda quando utilizamos Hibernate, EclipseLink ou outro provider qualquer serão apenas as propeties?
março 11th, 2010 16:42
@Crislaine,
Exato. Na JPA 2.0, mudaram essa parte onde declarávamos o provider. Agora somente configurações mais específicas de cada provider, no persistence.xml, serão necessárias.
março 15th, 2010 11:26
Mas aqui da erro no provider, nao consigo fazer o tutorial de prática..
Pode dar um help? att. Jonas
março 15th, 2010 11:38
@Jonas, erro como?
março 15th, 2010 11:47
Exception in thread “main” java.lang.NoClassDefFoundError: javax/persistence/spi/ProviderUtil
março 15th, 2010 11:48
achei seu tutorial muito bom, só que nao consigo fazer funcionar =/
março 15th, 2010 11:55
e tem esse erro também:
Exception in thread “main” java.lang.SecurityException: class “javax.persistence.spi.ProviderUtil”‘s signer information does not match signer information of other classes in the same package
março 15th, 2010 12:55
@Jonas,
Pela primeira exception, você esqueceu de adicionar esta biblioteca:
hibernate-jpa-2.0-api-1.0.0-CR-1.jar
março 15th, 2010 13:35
Sim, tinha percebido isso.. Mas no segundo erro ja tinha adicionado esta library ^^
E o erro mudou, por isso eu postei novamente com o novo erro..
Oque pode ser? Eu segui o tutorial =)
março 15th, 2010 13:53
Este erro poderia ser pelo fato de eu ter usado o EclipseLink 2.0.1 nas library???
Eu não tinha notado este detalhe, mas na teoria devia funcionar melhor, ao contrario de não funcionar o/ .. pode ser isso? Abraço e obrigado pela atenção
março 15th, 2010 13:56
@Jonas,
Coloque apenas as bibliotecas que citei, portanto, retire a do EclipseLink.
março 15th, 2010 14:29
Fiz exatamente igual, o erro foi este, OMG
Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/log4j/Level
março 15th, 2010 14:43
Opa, agradeço a ajuda. Consegui resolver, tive que adicionar uma Library que nao consta no tutorial. slf4j-simple-1.5.11 e funcionou.
Uma dúvida, ele criou a tabela tudo certo, mas no meu arquivo Categoria.java
ele fica acusando que meus atributos Id, Categoria, Descricao estão ein “cannot be resolved” why?
março 24th, 2010 10:28
Caro Edson, gostaria de parabenizar pelo seu artigo,
há alguns dias que estava tentando integrar o Hibernate no eclipse, e nada de conseguir… até que eu achei o seu blog e com este seu artigo didático conseguir “dar meus primeiros passos” com Hibernate JPA no eclipse IDE.
abril 1st, 2010 12:35
@Jorel,
Que bom que gostou. Vem mais artigos sobre ele.
abril 4th, 2010 18:09
Edson,
Tenho acompanhado seu trabalho e gostei muito do seu livro Desenvolvendo Aplicações Web com JSP, Servlets, JavaServer Faces… além de outros. Parabéns!
Bem, gostaria de uma opinião sua sobre o seguinte: Neste artigo Hibernate hates Spring de 2005, http://houseofhaug.wordpress.com/2005/08/12/hibernate-hates-spring/, rolava uma discussão sobre o avanço do Spring no campo de mapeamento objeto relacional (ORM). O Spring 2.5 trazia algumas implementações JPA que ao meu ver, corrija-me se estiver enganado, dispensavam o uso do hibernate.
Com o Spring 3 + JPA, ainda é preciso ter o Hibernate ou qualquer outra implementação como provider?
Se eu usar JSF 2.0, Facelets, RichFaces, Spring 3, Hibernate e JPA estarei cometendo alguma redundância ou sobreposição de recursos?
Obrigado,
Geucimar
abril 4th, 2010 18:26
@Geucimar,
Tanto o Hibernate como o EclipseLink, na versão da JPA 2.0 são excelentes ORMs. Antes o Hibernate tinha uma vantagem com relação a JPA por causa de criteria e outras facilitações que ainda vou escrever aqui no blog. Hoje a realidade é outra. Podemos usar tanto um como o outro sem nos preocuparmos com esses detalhes, graças a JPA 2.0.
Quanto a sua pergunta, a resposta é: Pode trabalhar com todas estas tecnologias pois, cada uma, não sobrepõe a outra. Cada uma tem um papel fundamental onde, juntas, tornam seu trabalho mais fácil e rápido de desenvolver.
Abraço,
Edson Gonçalves
maio 26th, 2010 11:06
Em relação a setResultTransformer, vi isso no Hibernate, estou usando o EclipseLink num projeto (Java x Flex) que acabei de iniciar e estou tendo probs com coleções (ainda n sei qual a minha barberagem), mas vi que no Hibernate há este recurso e n vi no EclipseLink, é isso mesmo, n tem?
outubro 16th, 2010 9:03
Muito bom o tutorial, porem nao consegui funfa, aqui acontece o seguinte erro “Exception in thread “main” javax.persistence.PersistenceException: Invalid persistence.xml.”. Como poderia resolver? Obrigado.
outubro 18th, 2010 23:19
@Thiago,
O erro informa qe o arquivo está inválido, ou seja, existem informações ou nós que não pertencem a ele.
março 8th, 2011 15:15
Seria interessante ter um projeto maven configurado com estas dependencias.
março 15th, 2011 13:45
@Emerson,
Concordo. Eu iniciei em um artigo o uso do Maven junto as dependencias de um projeto com Spring MVC, mas pretendo escrever somente sobre o framework.
Só não faço em todos os artigos, como este que comentou, porque lido com leitores em vários níveis de conhecimento e a intenção, no caso, é atingir os iniciantes. O Maven atrapalharia se eu não o explicasse e o artigo perderia o foco se eu o explicasse. Por isso o deixei de fora.