mar 09 2010

JPA 2.0 na Prática com Hibernate 3.5

Category: JPA 2.0Edson Gonçalves @ 21:07

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.

Figura 1 – Bibliotecas do Hibernate 3.5 e SLF4J adicionadas ao projeto

Figura 1 – Bibliotecas do Hibernate 3.5 e SLF4J adicionadas ao 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.

Tags: , , , , ,

24 Responses to “JPA 2.0 na Prática com Hibernate 3.5”

  1. Matheu Nobre says:

    Muito Bom Edson!!
    Uma pergunta em alguns tutoriais vi um mapeamento do provedor
    vc acha mesmo necessario?

  2. Edson Gonçalves says:

    @Matheu,

    Se está se referindo a determinação do provider, Hibernate ou EclipseLink, não é mais necessário na JPA 2.0.

  3. Crislaine says:

    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?

  4. Edson Gonçalves says:

    @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.

  5. Jonas says:

    Mas aqui da erro no provider, nao consigo fazer o tutorial de prática..

    Pode dar um help? att. Jonas

  6. Edson Gonçalves says:

    @Jonas, erro como?

  7. Jonas says:

    Exception in thread “main” java.lang.NoClassDefFoundError: javax/persistence/spi/ProviderUtil

  8. Jonas says:

    achei seu tutorial muito bom, só que nao consigo fazer funcionar =/

  9. Jonas says:

    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

  10. Edson Gonçalves says:

    @Jonas,
    Pela primeira exception, você esqueceu de adicionar esta biblioteca:
    hibernate-jpa-2.0-api-1.0.0-CR-1.jar

  11. Jonas says:

    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 =)

  12. Jonas says:

    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

  13. Edson Gonçalves says:

    @Jonas,

    Coloque apenas as bibliotecas que citei, portanto, retire a do EclipseLink.

  14. Jonas says:

    Fiz exatamente igual, o erro foi este, OMG

    Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/log4j/Level

  15. Jonas says:

    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?

  16. Jorel says:

    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.

  17. Edson Gonçalves says:

    @Jorel,

    Que bom que gostou. Vem mais artigos sobre ele.

  18. Geucimar says:

    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

  19. Edson Gonçalves says:

    @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

  20. Arilson says:

    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?

  21. Thiago says:

    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.

  22. Edson Gonçalves says:

    @Thiago,

    O erro informa qe o arquivo está inválido, ou seja, existem informações ou nós que não pertencem a ele.

  23. Emerson says:

    Seria interessante ter um projeto maven configurado com estas dependencias.

  24. Edson Gonçalves says:

    @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.

Leave a Reply