Sobre mim Frederico Maia Arantes / @fredmaia Programador Java EE na PC Sistemas Oracle Certified Java SE 6 Programmer (O...
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 ...
Qual a diferença entre JPA e Hibernate? JPA é uma especificação. Hibernate é uma implementação. Hibernate surgiu primei...
LOL! Agora posso esquecer dobanco de dados e pensar só nosobjetos!                         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 especia...
Entenda as estratégias herança Você deve entender as estratégias de herança do JPA e Hibernate:   @SingleTable   @Joine...
E essas aqui, conhece? LazyInitializationException TransientObjectException PersistentObjectException
LazyInitializationExceptionSession session = sessionFactory.openSession();NotaFiscal nf = (NotaFiscal) session.load(NotaFi...
TransientObjectExceptionAutor a = new Autor();Livro l = new Livro();a.setLivros(Collections.singleton(l));manager.persist(...
Ministério do JPA adverte:Use Cascade com moderação.
PersistentObjectExceptionProduto p = new Produto();p.setId(1l);p.setDescricao(“Computador”);manager.persist(p);org.hiberna...
Entenda os estados das entidades JPA Transient ou New: não possui identidade e não está associado a um EntityManager Man...
Cuidado com o Lazy Cuidado com OpenSessionInView para resolver Lazy exceptions. Planeje suas queries. Monte-as para obt...
Cuidado com as n+1 queries Uma NotaFiscal com Items lazy, gastamos duas queries. Para uma lista de NotaFiscal resultante ...
Utilize second level cache Utilize second level cache para consultas que você precisa muito. Estes dados não devem ser a...
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 to...
Pra que buscar sempre o objeto inteiro? Você tem na tela uma combobox de fornecedores e precisa de Id e Nome. Vai usar u...
Utilize o Hibernate Statistics Saiba quantas vezes cada entidade, coleção (relacionamento) e query está sendo carregada/e...
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 a...
Estude a documentação Estude a especificação do JPA. Estude a documentação do Hibenate. Estude o capítulo de performanc...
Obrigado!
Boas práticas com jpa 2 e hibernate   flisol 2012
Boas práticas com jpa 2 e hibernate   flisol 2012
Upcoming SlideShare
Loading in …5
×

Boas práticas com jpa 2 e hibernate flisol 2012

4,626 views

Published on

Palestra sobre o tema "Boas Práticas com JPA 2 e Hibernate". Apresentada no FLISOL 2012 em Goiânia (GO). Não poderia deixar de citar como fonte o excelente blog da Caleum. http://blog.caelum.com.br/

0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,626
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
113
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide
  • Quem aqui já conhece o GAE? Já desenvolveram algo?
  • Boas práticas com jpa 2 e hibernate flisol 2012

    1. 1. 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
    2. 2. Sobre vocês?
    3. 3. Antes que eu me esqueça...Fica, vai ter brindes.
    4. 4. 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.
    5. 5. 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”.
    6. 6. LOL! Agora posso esquecer dobanco de dados e pensar só nosobjetos! What??? Wait!!
    7. 7. 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!
    8. 8. 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 {
    9. 9. E essas aqui, conhece? LazyInitializationException TransientObjectException PersistentObjectException
    10. 10. LazyInitializationExceptionSession 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.
    11. 11. TransientObjectExceptionAutor 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.
    12. 12. Ministério do JPA adverte:Use Cascade com moderação.
    13. 13. PersistentObjectExceptionProduto 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.
    14. 14. 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
    15. 15. 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.
    16. 16. 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.
    17. 17. 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.
    18. 18. 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.
    19. 19. 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
    20. 20. 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.
    21. 21. Uuuuuii! Ele não usa SQL...assim pode mudar de banco de dados a hora que quiser.
    22. 22. 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.
    23. 23. 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.
    24. 24. Obrigado!

    ×