SlideShare uma empresa Scribd logo
Boas práticas com jpa 2 e hibernate   flisol 2012
Sobre mim
 Frederico Maia Arantes / @fredmaia
 Programador Java EE na PC Sistemas
 Oracle Certified Java SE 6 Programmer (OCJP 6)
 Instrutor Java na Supera Tecnologia
 JUGLeader do Gojava
 Artigo na Easy Java Magazine (Devmedia)
 http://devsexperts.com
Sobre vocês?
Antes que eu me esqueça...

Fica, vai ter brindes.
O Hibernate
 Framework para mapeamento Objeto Relacional.
 Mapear o banco para as classes.

 Simplifica o desenvolvimento e aumenta
 produtividade. Independência de banco de dados e
 muitas outras vantagens.

 Mas é preciso conhecer bem seus frameworks.
Qual a diferença entre JPA e Hibernate?
 JPA é uma especificação.

 Hibernate é uma implementação.

 Hibernate surgiu primeiro e a JPA foi inspirada em
 frameworks como ele, TopLink, EclipseLink.
 JPA são “regras” de como deve ser feito. O
 Hibernate pode ser usado como implementação
 destas regras ou com suas “próprias regras”.
LOL! Agora posso esquecer do
banco de dados e pensar só nos
objetos!


                         What??? Wait!!
Não esqueça do Banco de Dados
 Pelo contrário, tenha muita atenção para não perder
 performance!
 Em OO pensamos em especializar, dividir
 responsabilidades, classes pequenas e coesas.
 No banco de dados nem sempre é bom dividir, as
 vezes é bom unir e evitar consultas com vários joins
 desnecessários.
 Em banco de dados não existe herança!
Entenda as estratégias herança
 Você deve entender as estratégias de herança do
 JPA e Hibernate:
   @SingleTable

   @Joined

   @TablePerClass

  public class Pessoa extends PessoaJuridica {
E essas aqui, conhece?
 LazyInitializationException

 TransientObjectException

 PersistentObjectException
Boas práticas com jpa 2 e hibernate   flisol 2012
LazyInitializationException
Session session = sessionFactory.openSession();
NotaFiscal nf = (NotaFiscal) session.load(NotaFiscal.class, 42);
session.close();
List<Item> items = nf.getItems();
System.out.println("numero de pedidos:" + items.size());
org.hibernate.LazyInitializationException

 Porque? Como resolver?

 Sessão fechada ao tentar buscar os itens.

 Eager, manter a sessão aberta ou fetch.

 O ideal? Planeje suas queries, use Lazy nos
   relacionamentos e fetch ao buscar os registros.
TransientObjectException
Autor a = new Autor();
Livro l = new Livro();
a.setLivros(Collections.singleton(l));
manager.persist(a);
org.hibernate.TransientObjectException - object references an unsaved transient
  instance

 Porque? Como resolver?

 Livro não está sendo salvo, apenas o autor.

 Chame o persist(l) na transação ou use Cascade no
  relacionamento entre Autor e Livro.
Ministério do JPA adverte:



Use Cascade com moderação.
PersistentObjectException
Produto p = new Produto();
p.setId(1l);
p.setDescricao(“Computador”);
manager.persist(p);

org.hibernate.PersistentObjectException: detached entity passed to persist

 Porque? Como resolver?

 Seu id está @GeneratedValue e sua entidade
  detached. Deveria estar transiente ou managed.
 Antes de persistir use o find, ou o merge.
Entenda os estados das entidades JPA
 Transient ou New: não possui identidade e não
 está associado a um EntityManager

 Managed: possui identidade, está associado, seu
 conteúdo é sincronizado com o banco de dados

 Detached: possui identidade, mas não está
 associado, portanto não é sincronizado
Cuidado com o Lazy
 Cuidado com OpenSessionInView para resolver
 Lazy exceptions.

 Planeje suas queries.

 Monte-as para obter o resultado de acordo com o
 que precisa em cada cenário.
Cuidado com as n+1 queries
 Uma NotaFiscal com Items lazy, gastamos

 duas queries. Para uma lista de NotaFiscal
 resultante de uma query, para cada
 NotaFiscal teremos uma nova query executada para
 todo getItems invocados. 1 query para
 listar NotaFiscal, N queries para pegar os relacionamentos.
 Use configurações de batch-size e fetch-size para carregar
 as entidades/relacionamentos em blocos em vez de 1 em 1.
Utilize second level cache
 Utilize second level cache para consultas que você
 precisa muito.

 Estes dados não devem ser alterados com
 frequência.

 Reduza suas idas ao banco de dados.
Utilize um pool de conexões
 Mantém um número (que você define) de conexões
 abertas sempre, evita o custo de abrí-las a todo o
 momento e cair no OneSessionPerRequest.

 Se estiver usando o hibernate sem um servidor EE
 uma boa opção é o C3P0.

 Ou utilize um servidor JEE e configue nele mesmo.
Pra que buscar sempre o objeto inteiro?
 Você tem na tela uma combobox de fornecedores e
 precisa de Id e Nome.

 Vai usar um “from Fornecedor” e trazer
 Id, Nome, CNPJ, Razão
 Sozial, CNAE, Endereço, Status, Tipo do
 Fornecedor... ?

 Use: select f.id, f.nome from Fornecedor f
Utilize o Hibernate Statistics
 Saiba quantas vezes cada entidade, coleção
 (relacionamento) e query está sendo
 carregada/executada.
 Quantas vezes o cache foi usado.

 Tempo médio de cada query.

 Com estes dados, saiba onde colocar
 cache, configurar batchsize e fazer joins com fetch
 eager.
Uuuuuii! Ele não usa SQL...




assim pode mudar de banco de dados a
           hora que quiser.
Vai mesmo mudar de banco de dados?
 Poucos sistemas tem que rodar realmente em
 vários BD’s ou têm possibilidade de serem
 alterados.
 Seu sistema se encaixa neste cenário?

 Então não tenho medo de utilizar SQL nativo se
 precisar. Você pode estar perdendo excelentes
 recursos que os bancos de dados oferecem.
Estude a documentação
 Estude a especificação do JPA.

 Estude a documentação do Hibenate.

 Estude o capítulo de performance do hibernate.

 Estude seu banco de dados.

 Estude... sempre.
Obrigado!

Mais conteúdo relacionado

PPTX
Minicurso jpa e hibernate
PPT
Introdução a JPA e Hibernate - TDC 2012
PDF
Persistência Java: Hibernate e JPA
PDF
Persistência com JPA usando o NetBeans 7
PDF
JPA com Hibernate
PPT
JPA - Java Persistence API
PPT
Jpa – Java Persistence Api
POT
Mini curso hibernate com anotações
Minicurso jpa e hibernate
Introdução a JPA e Hibernate - TDC 2012
Persistência Java: Hibernate e JPA
Persistência com JPA usando o NetBeans 7
JPA com Hibernate
JPA - Java Persistence API
Jpa – Java Persistence Api
Mini curso hibernate com anotações

Mais procurados (20)

PDF
Hibernate conceitos
ODP
Anotações do mapeamento OR
ODP
Hibernate-consultas
ODP
Polis Hyperlink Dicas e truques de Performance para JPA e EJB
PDF
Introdução ao JPA com Hibernate
PDF
Abstração do banco de dados com PHP Doctrine
PDF
Doctrine 2 camada de persistência para php
PPTX
Jpa, hibernate and jpql
PDF
Apostila hibernate
PDF
Spring Data Jpa
PDF
Como criar Custom Tags
PPTX
BRMS - Business Rules Management System
PDF
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
PPTX
Mapeamento Objeto-Relacional com Java Persistence API
PDF
POO - 21 - Java e Banco de Dados
PPTX
Java database connectivity jdbc
PDF
Curso de Java Persistence API (JPA) (Java EE 7)
PPT
Java20141219
PDF
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
PDF
Jj08 otimizacao
Hibernate conceitos
Anotações do mapeamento OR
Hibernate-consultas
Polis Hyperlink Dicas e truques de Performance para JPA e EJB
Introdução ao JPA com Hibernate
Abstração do banco de dados com PHP Doctrine
Doctrine 2 camada de persistência para php
Jpa, hibernate and jpql
Apostila hibernate
Spring Data Jpa
Como criar Custom Tags
BRMS - Business Rules Management System
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Mapeamento Objeto-Relacional com Java Persistence API
POO - 21 - Java e Banco de Dados
Java database connectivity jdbc
Curso de Java Persistence API (JPA) (Java EE 7)
Java20141219
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
Jj08 otimizacao
Anúncio

Destaque (13)

PDF
Hibernate
PDF
Apresentação mapeamento objeto relacional
PDF
2 1-jpa-mapeamento-simples
PPT
PDF
INTERFACES para o USUÁRIO - a base de um sistema de gerenciamento para restau...
ODP
Processos iniciais do mapeamento OR
PDF
Workshop modelando usuários, tarefas e idéias
PPT
Aula JPA
PPTX
Sistema de gestão de restaurantes self service - ultima versão 3
PDF
Introdução ao JPA com Hibernate
PPS
Restaurante
PDF
Apostila Java Web com JSF, JPA e Primefaces
PDF
Aula parte 1 de JSF 2.2
Hibernate
Apresentação mapeamento objeto relacional
2 1-jpa-mapeamento-simples
INTERFACES para o USUÁRIO - a base de um sistema de gerenciamento para restau...
Processos iniciais do mapeamento OR
Workshop modelando usuários, tarefas e idéias
Aula JPA
Sistema de gestão de restaurantes self service - ultima versão 3
Introdução ao JPA com Hibernate
Restaurante
Apostila Java Web com JSF, JPA e Primefaces
Aula parte 1 de JSF 2.2
Anúncio

Semelhante a Boas práticas com jpa 2 e hibernate flisol 2012 (20)

PPT
Course Hibernate 2008
ODP
Mapeamento de herança OR
PDF
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
PPT
Hibernate
PDF
Hibernate efetivo (COALTI-2014 / ALJUG)
PDF
Usando hiberante de forma otimizada
PPTX
Persistência com JPA e Hibernate
PPTX
TechDays 2010 - Introdução ao NHibernate
PPTX
Hibernate
PDF
Hibernate reference pt-br
PDF
Hibernate efetivo (IA-2014 / Disturbing the Mind)
PDF
hibernate annotation
PDF
Hibernate Reference20061120
PPTX
ORM: Sendo produtivo com NHibernate
PDF
JPA - Mini-Livro - Iniciação e Conceitos
PDF
Persistência JPA
PDF
Linguagem 3 (JPA e hibernate)
POT
Mini curso hibernate com anotações
PPT
Curso De Hibernate 3
Course Hibernate 2008
Mapeamento de herança OR
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Hibernate
Hibernate efetivo (COALTI-2014 / ALJUG)
Usando hiberante de forma otimizada
Persistência com JPA e Hibernate
TechDays 2010 - Introdução ao NHibernate
Hibernate
Hibernate reference pt-br
Hibernate efetivo (IA-2014 / Disturbing the Mind)
hibernate annotation
Hibernate Reference20061120
ORM: Sendo produtivo com NHibernate
JPA - Mini-Livro - Iniciação e Conceitos
Persistência JPA
Linguagem 3 (JPA e hibernate)
Mini curso hibernate com anotações
Curso De Hibernate 3

Mais de Frederico Maia Arantes (12)

PPTX
The best way to create and deploy web apps with full-stack type safety - Mete...
PPTX
Produtividade e deploy na criação de apps NodeJS com MeteorJS - Join Communit...
PDF
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!
PDF
Apresentando meteor! Join Community - Goiânia
PDF
Java 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto Alegre
PDF
Meteor - Nunca foi tão fácil desenvolver pra web e mobile
PDF
Java Web Fácil com VRaptor
PDF
Java no Google App Engine - TDC2011
PDF
Cloud Computing - Java no Google App Engine
PDF
Visão Geral do Java para Iniciantes - FLISOL 2011
PPTX
JSF 2 e Primefaces - 4º Encontro Mensal do Gojava
PPTX
Java e orientação a objetos
The best way to create and deploy web apps with full-stack type safety - Mete...
Produtividade e deploy na criação de apps NodeJS com MeteorJS - Join Communit...
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!
Apresentando meteor! Join Community - Goiânia
Java 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto Alegre
Meteor - Nunca foi tão fácil desenvolver pra web e mobile
Java Web Fácil com VRaptor
Java no Google App Engine - TDC2011
Cloud Computing - Java no Google App Engine
Visão Geral do Java para Iniciantes - FLISOL 2011
JSF 2 e Primefaces - 4º Encontro Mensal do Gojava
Java e orientação a objetos

Boas práticas com jpa 2 e hibernate flisol 2012

  • 2. Sobre mim Frederico Maia Arantes / @fredmaia  Programador Java EE na PC Sistemas  Oracle Certified Java SE 6 Programmer (OCJP 6)  Instrutor Java na Supera Tecnologia  JUGLeader do Gojava  Artigo na Easy Java Magazine (Devmedia)  http://devsexperts.com
  • 4. Antes que eu me esqueça... Fica, vai ter brindes.
  • 5. O Hibernate  Framework para mapeamento Objeto Relacional. Mapear o banco para as classes.  Simplifica o desenvolvimento e aumenta produtividade. Independência de banco de dados e muitas outras vantagens.  Mas é preciso conhecer bem seus frameworks.
  • 6. Qual a diferença entre JPA e Hibernate?  JPA é uma especificação.  Hibernate é uma implementação.  Hibernate surgiu primeiro e a JPA foi inspirada em frameworks como ele, TopLink, EclipseLink.  JPA são “regras” de como deve ser feito. O Hibernate pode ser usado como implementação destas regras ou com suas “próprias regras”.
  • 7. LOL! Agora posso esquecer do banco de dados e pensar só nos objetos! What??? Wait!!
  • 8. Não esqueça do Banco de Dados  Pelo contrário, tenha muita atenção para não perder performance!  Em OO pensamos em especializar, dividir responsabilidades, classes pequenas e coesas.  No banco de dados nem sempre é bom dividir, as vezes é bom unir e evitar consultas com vários joins desnecessários.  Em banco de dados não existe herança!
  • 9. Entenda as estratégias herança  Você deve entender as estratégias de herança do JPA e Hibernate:  @SingleTable  @Joined  @TablePerClass public class Pessoa extends PessoaJuridica {
  • 10. E essas aqui, conhece?  LazyInitializationException  TransientObjectException  PersistentObjectException
  • 12. LazyInitializationException Session session = sessionFactory.openSession(); NotaFiscal nf = (NotaFiscal) session.load(NotaFiscal.class, 42); session.close(); List<Item> items = nf.getItems(); System.out.println("numero de pedidos:" + items.size()); org.hibernate.LazyInitializationException  Porque? Como resolver?  Sessão fechada ao tentar buscar os itens.  Eager, manter a sessão aberta ou fetch.  O ideal? Planeje suas queries, use Lazy nos relacionamentos e fetch ao buscar os registros.
  • 13. TransientObjectException Autor a = new Autor(); Livro l = new Livro(); a.setLivros(Collections.singleton(l)); manager.persist(a); org.hibernate.TransientObjectException - object references an unsaved transient instance  Porque? Como resolver?  Livro não está sendo salvo, apenas o autor.  Chame o persist(l) na transação ou use Cascade no relacionamento entre Autor e Livro.
  • 14. Ministério do JPA adverte: Use Cascade com moderação.
  • 15. PersistentObjectException Produto p = new Produto(); p.setId(1l); p.setDescricao(“Computador”); manager.persist(p); org.hibernate.PersistentObjectException: detached entity passed to persist  Porque? Como resolver?  Seu id está @GeneratedValue e sua entidade detached. Deveria estar transiente ou managed.  Antes de persistir use o find, ou o merge.
  • 16. Entenda os estados das entidades JPA  Transient ou New: não possui identidade e não está associado a um EntityManager  Managed: possui identidade, está associado, seu conteúdo é sincronizado com o banco de dados  Detached: possui identidade, mas não está associado, portanto não é sincronizado
  • 17. Cuidado com o Lazy  Cuidado com OpenSessionInView para resolver Lazy exceptions.  Planeje suas queries.  Monte-as para obter o resultado de acordo com o que precisa em cada cenário.
  • 18. Cuidado com as n+1 queries  Uma NotaFiscal com Items lazy, gastamos duas queries. Para uma lista de NotaFiscal resultante de uma query, para cada NotaFiscal teremos uma nova query executada para todo getItems invocados. 1 query para listar NotaFiscal, N queries para pegar os relacionamentos.  Use configurações de batch-size e fetch-size para carregar as entidades/relacionamentos em blocos em vez de 1 em 1.
  • 19. Utilize second level cache  Utilize second level cache para consultas que você precisa muito.  Estes dados não devem ser alterados com frequência.  Reduza suas idas ao banco de dados.
  • 20. Utilize um pool de conexões  Mantém um número (que você define) de conexões abertas sempre, evita o custo de abrí-las a todo o momento e cair no OneSessionPerRequest.  Se estiver usando o hibernate sem um servidor EE uma boa opção é o C3P0.  Ou utilize um servidor JEE e configue nele mesmo.
  • 21. Pra que buscar sempre o objeto inteiro?  Você tem na tela uma combobox de fornecedores e precisa de Id e Nome.  Vai usar um “from Fornecedor” e trazer Id, Nome, CNPJ, Razão Sozial, CNAE, Endereço, Status, Tipo do Fornecedor... ?  Use: select f.id, f.nome from Fornecedor f
  • 22. Utilize o Hibernate Statistics  Saiba quantas vezes cada entidade, coleção (relacionamento) e query está sendo carregada/executada.  Quantas vezes o cache foi usado.  Tempo médio de cada query.  Com estes dados, saiba onde colocar cache, configurar batchsize e fazer joins com fetch eager.
  • 23. Uuuuuii! Ele não usa SQL... assim pode mudar de banco de dados a hora que quiser.
  • 24. Vai mesmo mudar de banco de dados?  Poucos sistemas tem que rodar realmente em vários BD’s ou têm possibilidade de serem alterados.  Seu sistema se encaixa neste cenário? Então não tenho medo de utilizar SQL nativo se precisar. Você pode estar perdendo excelentes recursos que os bancos de dados oferecem.
  • 25. Estude a documentação  Estude a especificação do JPA.  Estude a documentação do Hibenate.  Estude o capítulo de performance do hibernate.  Estude seu banco de dados.  Estude... sempre.

Notas do Editor

  • #3: Quem aqui já conhece o GAE? Já desenvolveram algo?