Qual a importancia de se utilizar JPA ao invés de Hibernate?  XML
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Autor Mensagem
rogelgarcia
GUJ Master
[Avatar]

Membro desde: 21/06/2007 23:27:21
Mensagens: 1850
Offline

Com a nova (nem tão nova assim) onda de se utilizar JPA ao invés de Hibernate, surgem as questões...

Quase todo mundo que hoje utiliza JPA, tem como implementação o Hibernate que já utilizavam anteriormente..

O JPA introduziu novas interfaces e classes além do que já tinhamos que saber com o Hibernate. Mas o JPA não é uma especificação completa porque ainda é necessário em alguns momentos utilizar coisas especificas do Hibernate.

O JPA acabou introduzindo uma nova camada de persistencia e nós sabemos que camadas em cima de camadas trazem problemas.

Se a implementação de JPA que todo mundo utiliza é o Hibernate, qual é a utilidade de se ter JPA?

This message was edited 1 time. Last update was at 16/03/2010 23:45:37


Rógel Garcia, criador do framework NEXT

http://www.nextframework.org
Lavieri
GUJ Master
[Avatar]

Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline

Seguinte....

Hiberante padrão não implementa JPA

vc pode usar ele direto, mas não vai conseguir usar tudo que o JPA oferece


o JPA oferece menos coisa que o Hibernate.... mais oferece algumas coisas de forma diferente do hiberante com interface mais faceis...


o hiberante pra atender ao JPA criou um adaptador, o pactoe EntityManager, que implementa o JPA ou seja, ele nada mais faz que delegar pra interface do JPA os comandos corretos em uma Session....

Se vc usa Hiberante não pode usar @EntityListeners() por exemplo, para callbacks, vai ter que usar intereptors do hibernate....

Se vc usar JPA Puro, não vai ter várias coisas que só tem no Hiberante....

............

Solução ? cria o JPA usando o Hiberante.... passa a poder usar tudo do HIBERNATE e tudo do JPA.... cria os entitymanager normalmente.... e pra pegar a session basta fazer

Session session = (Session)EntityManger.getDelegate();


A vantagem é que vc consegue usar os 2....


...........

E fora isso quase todo mundo cria uma camada do seu projeto (ou com DAO, que eu desaprovo, ou com Repository, que é o que uso) ....

No caso seu projeto conversa como Repository ou DAO que é um adpatador para o JPA (ou diretamenteo hibernate) que é um adaptador para a Session (no caso de usar jpa) ....

Assim seu projeto passa a depender de uma estrutura propria, o Repository ou o DAO .... e se omundo cair, explodir, houver uma guerra, e vc resolver mudar no proximo projeto a implementação de persistencia, vai continuar utiliando sua estrutura de DAO ou Repository, e assim sua Lógica, fica protegida dessa sua escolha de persistencia

Sun Certified Java Programmer (SCJP 6)

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999

Meu blog -> http://blog.tomazlavieri.com.br/
[ICQ]
rogelgarcia
GUJ Master
[Avatar]

Membro desde: 21/06/2007 23:27:21
Mensagens: 1850
Offline

Entendi..

Mas o que eu questiono é o seguinte.. se na verdade você mesmo usando JPA, vai estar utilizando é o Hibernate...

Pra que JPA?? Porque nao usar o Hibernate direto como sempre foi feito?

Que vantagem tem no JPA??

(Entende o que eu quero dizer?)

Rógel Garcia, criador do framework NEXT

http://www.nextframework.org
Lavieri
GUJ Master
[Avatar]

Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline

rogelgarcia wrote:Entendi..

Mas o que eu questiono é o seguinte.. se na verdade você mesmo usando JPA, vai estar utilizando é o Hibernate...

Pra que JPA?? Porque nao usar o Hibernate direto como sempre foi feito?

Que vantagem tem no JPA??

(Entende o que eu quero dizer?)


não é exatamente igual.... JPA é uma interface... é uma especificação, ele não é uma implementação, ele vem pra dizer....

quer criar um pacote de persistence ? use a interface JPA, usando esssa interface vc poderá ser escolhido por quem utiliza JPA

..............

Hiberante é uma implementação real, e nã nasceu pra implementar o JPA, por isso ele tem suas proprias interfaces, e tem mais recurso que a implementação do JPA poderia pedir....

Para solucionar o Hierante criou um Adaptador.... que simplismente atende a tudo do JPA, a 100% da especificação JPA, e continua funcionando como antes, com a espcificiação do Hiberante.....

Usar hiberante sozinho, não vai ter as funcionalidades do JPA....

.................

por exemplo



por exemplo, se vc criar uma SessionFactory, e tentar persistir uma Entidade, ela não vai chamar o Auditor, e assim setar a data correta de criação.

Porem criando uma EntityManagerFactory, ele vai fucionar, mesmo que a implementação seja o Hiberante....


a maioria das anotações são do JPA e não do Hiberante, e anotação é melhor q xml, mais um motivo pra pelomenos instnaciar pelo JPA

This message was edited 4 times. Last update was at 17/03/2010 00:03:28


Sun Certified Java Programmer (SCJP 6)

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999

Meu blog -> http://blog.tomazlavieri.com.br/
[ICQ]
rogelgarcia
GUJ Master
[Avatar]

Membro desde: 21/06/2007 23:27:21
Mensagens: 1850
Offline

Sim.. eu sei que JPA é só uma especificação e Hibernate é uma implementação... isso é claro pra mim..

A minha questão é.. pra que JPA? Qual a vantagem eu tenho em relação a usar só o hibernate?


-----
Sobre a questão do Listener, isso é só uma forma diferente de fazer a mesma coisa que é possível fazer com hibernate..

E o hibernate tem o hibernate annotations... então trabalhar com annotations no hibernate nao é problema.. mesmo sem usar JPA

------

O que eu quero dizer é.. o Hibernate atende, inclusive melhor que se usar só a interface JPA.. entao pra que eu vou querer JPA?

Rógel Garcia, criador do framework NEXT

http://www.nextframework.org
rogelgarcia
GUJ Master
[Avatar]

Membro desde: 21/06/2007 23:27:21
Mensagens: 1850
Offline

O que eu to querendo chamar a atençao.. é que parece invenção de moda.. entende?

Rógel Garcia, criador do framework NEXT

http://www.nextframework.org
Lavieri
GUJ Master
[Avatar]

Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline

rogelgarcia wrote:Sim.. eu sei que JPA é só uma especificação e Hibernate é uma implementação... isso é claro pra mim..

A minha questão é.. pra que JPA? Qual a vantagem eu tenho em relação a usar só o hibernate?


-----
Sobre a questão do Listener, isso é só uma forma diferente de fazer a mesma coisa que é possível fazer com hibernate..

E o hibernate tem o hibernate annotations... então trabalhar com annotations no hibernate nao é problema.. mesmo sem usar JPA

------

O que eu quero dizer é.. o Hibernate atende, inclusive melhor que se usar só a interface JPA.. entao pra que eu vou querer JPA?


A pergunta na verdade é ao contrario ...


Pra que se amarrar única e exclusivamente ao Hiberante ? se eu consigo mapear todas as minhas entidades com JPA ? e assim posso usar outra Unidade de persistencia como Link por exemplo, no caso de um dia precisar ?


vc não conhece o amanha, e em java uma das boas praticas dizem.... não programe para implementação, programe para a interface... e é isso que é programar para o JPA

Sun Certified Java Programmer (SCJP 6)

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999

Meu blog -> http://blog.tomazlavieri.com.br/
[ICQ]
Lavieri
GUJ Master
[Avatar]

Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline

por exemplo vc já deve ter cançado de ver isso escrito por ai



e vc já se perguntou ? pq não fazer



já que uma arraylist é mais poderosa que apenas a interface ? afinal a arraylista tem implementações, e pode ter propriedades únicas....


o problema de fazer isso é que vc amarra a droga da ArrayList, e existem outros tipos de lista por ai!

e se vc fizer um método


vai acabar se ferrando, pq por exemplo, a lista do Hiberante é uma PersistenceBag, e não uma ArrayList, e não vai conseguir usar....

subindo o nivel, para a interface mais abrangende, vc abre o leque de opções.....



tem um nivel de acoplamento muito mais baixo.... pois aceita muito mais gente

e digo mais! se dentro dessa lógica, vc tiver apenas um FOR, mesmo que em seu projeto vc saiba que só tem list, vc deve escrever Collection<?> e não List<?>

por isso

This message was edited 1 time. Last update was at 17/03/2010 00:16:51


Sun Certified Java Programmer (SCJP 6)

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999

Meu blog -> http://blog.tomazlavieri.com.br/
[ICQ]
rogelgarcia
GUJ Master
[Avatar]

Membro desde: 21/06/2007 23:27:21
Mensagens: 1850
Offline

Lavieri wrote:
Pra que se amarrar única e exclusivamente ao Hiberante ? se eu consigo mapear todas as minhas entidades com JPA ? e assim posso usar outra Unidade de persistencia como Link por exemplo, no caso de um dia precisar ?


vc não conhece o amanha, e em java uma das boas praticas dizem.... não programe para implementação, programe para a interface... e é isso que é programar para o JPA


Acho que é muito improvavel alguém trocar de implementacao de JPA, isso é trocar seis por meia dúzia...
E aposto o que for.... que nessa troca vão haver bugs... pois não teria vantagem trocar de implementacao a nao ser pra usar as coisas especificas...

Pelo que eu já vi na minha vida isso nao funciona... é bonito na teoria mas na pratica é diferente...

E pra voce chegar a trocar isso o sistema tem que ser tão antigo... e vai ter tantas coisas novas.. e incompatíveis com o que já foi feito...

Valeria a questão das várias implementações de JPA... se a especificação fosse boa..

JPA na verdade foi criado baseando-se no hibernate... Fizeram ao contrário da sua lógica.. primeiro fizeram a implementacao.. depois a interface.. ou seja.. a interface ficou atrelada a implementacao do mesmo jeito...



Mas valeu seus comentários... vamos ver como esse negócio de JPA caminha...
Na minha humilde opinião.. só tá servindo pra complicar

Rógel Garcia, criador do framework NEXT

http://www.nextframework.org
rogelgarcia
GUJ Master
[Avatar]

Membro desde: 21/06/2007 23:27:21
Mensagens: 1850
Offline

O exemplo da lista eu considero mais pertinente que o JPA.. pois a interface é bem definida.. e tem várias implementacoes.. uma para cada situacao...

Rógel Garcia, criador do framework NEXT

http://www.nextframework.org
rogelgarcia
GUJ Master
[Avatar]

Membro desde: 21/06/2007 23:27:21
Mensagens: 1850
Offline

Acho que o povo gasta fosfato demais pensando coisas cabulosas.. em vez de pensar no simples..

quer ver um exemplo

A anotação @ManyToOne.. já é fetch EAGER por default...

se vc quiser LAZY tem que colocar em todas as annotacoes...

olha que saco.. ao invés de vc configurar isso uma vez só na sua aplicacao...

Ao invés de o povo preocupar com coisa útil.. fica viajando.. em super arquiteturas....

Por isso os Rails tao aí dominando tudo.. é facil e tem um jeito de fazer e bem feito..

Rógel Garcia, criador do framework NEXT

http://www.nextframework.org
Lavieri
GUJ Master
[Avatar]

Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline

nop, JPA foi criada para o Link, que era da oracle, e foi passada a eclipse fundation, e a implementação do JPA2 que tem muita base no hiberante, principalmente em criteria...


O reuso não é exatamente do seu projeto, vc não vai pegar seu projeto, e apagar o Hiberante e enfiar um TopLink um EclipseLink ou coisas do tipo....


Mas vc pode se ver na situação de pegar um projeto usando EclipseLink, e simplismente não conhecer nada de JPA e nada de EclipseLink, e acabar não conseguindo reutilizar nada que ja usou na vida, apesar de ter anos de experiencia com ORM não vai conseguir se dar bem nesse novo projeto...


o que vc reusa são os componentes, por exemplo.... eu tenho várias entidadees, que dou CTRL+C e CTRL+V em novos projetos.... e não tenho que alterar 1 virgula....

se pegar um projeto diferente do meu mundo, pelomenos eu escrevi elas para algo de aceitação geral...


...........


por exemplo,

se vc escrever

session.save(entity); .... só vai reusuar em ambiente com hibernate

se usar entityManger.persist(entity); .... já vai poder reusuar em qualquer ambiente com JPA, e isso inclui o proprio hiberante

se usar repository.add(entity) .... vai poder escrever seu repositorio, e poder reusar a lógica criada em qualquer lugar

e se seu novo projeto não for com hiberante, vc precisará reescreverapenas o repositorio, mas nunca reescrever todo chamada a um .persist, ou .save

..........

e não to falando isso pq é bonito, ou é lindo na teoria, isso é pratica, e enclusive se chama boas praticas ^^

Sun Certified Java Programmer (SCJP 6)

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999

Meu blog -> http://blog.tomazlavieri.com.br/
[ICQ]
marciorodr0
Thread.start()
[Avatar]

Membro desde: 04/08/2008 12:55:16
Mensagens: 49
Localização: Carapicuíba SP
Offline

Tópico legal...

A Sun sempre faz isso... pega as boas idéias do mercado e documenta... específica, padroniza, acho muito legal isso...
Ao meu ver a única vantagem mesmo de utilizar em uma implementação JTA, apenas o que está especificado pela Sun, é a possibilidade de troca da implementação...
Mas, convenhamos, ninguém faz isso, como já foi dito anteriormente...

abss

This message was edited 1 time. Last update was at 17/03/2010 00:37:41


Sun Certified Programmer for the Java 2 Plataform, Standard Edition 5.0 - PASS 97%
Sun Certified Web Component Developer for the Java 2 Plataform, Enterprise Edition 5.0 - PASS 100%
Sun Certified Business Component Developer for the Java Platform, Enterprise Edition 5.0 - PASS 98%
[MSN]
rogelgarcia
GUJ Master
[Avatar]

Membro desde: 21/06/2007 23:27:21
Mensagens: 1850
Offline

Entendi... a proposta... é um ambito maaaiorrr do que eu estava pensando...

Pro projeto que eu faço aqui .. nao tem validade mesmo nao...

Tem caso eu for passar esse projeto pra alguém.. ele vai estar mais padronizado...


(eu to ligado nas boas praticas... eu concordo também.. mas o que fico indignado é que ao invés de resolver o problema mesmo.. o povo fica querendo crescer e crescer e inventando coisas.. se o que já existe nem tá tao bom assim...
já fuçei muito o código do hibernate... que tragédia... de boas práticas aquilo passou longe.. hahhah)

Eu uso o hibernate.. mas acho ele muito limitado.. mas num tem outro né?!

Rógel Garcia, criador do framework NEXT

http://www.nextframework.org
Lavieri
GUJ Master
[Avatar]

Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline

rogelgarcia wrote:Entendi... a proposta... é um ambito maaaiorrr do que eu estava pensando...

Pro projeto que eu faço aqui .. nao tem validade mesmo nao...

Tem caso eu for passar esse projeto pra alguém.. ele vai estar mais padronizado...


(eu to ligado nas boas praticas... eu concordo também.. mas o que fico indignado é que ao invés de resolver o problema mesmo.. o povo fica querendo crescer e crescer e inventando coisas.. se o que já existe nem tá tao bom assim...
já fuçei muito o código do hibernate... que tragédia... de boas práticas aquilo passou longe.. hahhah)

Eu uso o hibernate.. mas acho ele muito limitado.. mas num tem outro né?!


esse é o fato... tem outro sim... e épra isso que o JPA esta ai... pra ter muitooosssss outros....

antes só existia as coleções do Java Collections Framework.... hoje quase todo mundo usa as do google pq são melhores (sem falar que a um tempinho atras tinhas ainda as da apache).... imagina se vc programasse pra implmentação ? apenas por saber que... implentação X é a melhor ?

..........

Exite TopLink, EclipseLink, que seriam como versão 1 e 2, de uma mesma base.... existem mais, acredito, mas pelomenos tem essas


o EclipseLInk vem como padrão no Eclipse, e tem muita gente que usa... claro que nem se compara a quantidade que usa hiberante....

pensar só no seu projeto, vc não vai longe.... com certeza um dia, vc vai mudar de projeto, e abranger a quantidade de código que vc possa reusar é bom, na hora de mudar de abordagem

This message was edited 1 time. Last update was at 17/03/2010 00:46:10


Sun Certified Java Programmer (SCJP 6)

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999

Meu blog -> http://blog.tomazlavieri.com.br/
[ICQ]
 
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Ir para:   
Powered by JForum 2.1.8 © JForum Team