SlideShare ist ein Scribd-Unternehmen logo
1 von 17
Downloaden Sie, um offline zu lesen
Programação II - Prof. Fernando dos Santos




                          Java Persistence API (JPA)
                        Mapeamento de Relacionamentos

                                                Fernando dos Santos
                                             fernando.santos@udesc.br
Programação II - Prof. Fernando dos Santos



   Mapeamento de Relacionamentos
   Associação, Agregação, Composição

   • Tipos de Relacionamentos mapeáveis:
          – Um para Um
                                                       Produto
          – Muitos para Um                                                                 Categoria
                                             -   id: int
          – Um para Muitos                   -   nome: String                          -   id: int
                                             -   descricao: String
                                                                              0..*   1 -   nome: String
                                             -   precoUnitario: float

                                             +   métodos get()/set() : void




                                                                                                          2
Programação II - Prof. Fernando dos Santos



   Relacionamento Muitos para Um
   Mapeamento
   • Muitos produtos estão associados à uma categoria.




   • Entidade Produto possui atributo para associar com Categoria
          – na tabela: coluna id_categoria INT (chave estrangeira)
          – na classe: atributo categoriaProduto do tipo Categoria (classe)
   • O mapeamento é definido na entidade “muitos” (que possui a
     chave estrangeira) - Produto

                                                                              3
Programação II - Prof. Fernando dos Santos



   Relacionamento Muitos para Um
   Mapeamento com anotações @ManyToOne e @JoinColumn
    @Entity
    @Table(name=“produto")
    public class Produto implements Serializable {
      @Id
      @GeneratedValue
      private int id;
      @Column(name="nome")
      private String nome;
      @Column(name=“descricao")
      private String senha;
      @Column(name=“valor_unitario")
      private float precoUnitario;

        @ManyToOne
        @JoinColumn(name="id_categoria", nullable=false)
        private Categoria categoriaProduto;
    }

                                                           4
Programação II - Prof. Fernando dos Santos



   Relacionamento Muitos para Um
   Anotações @ManyToOne e @JoinColumn - OBSERVAÇÕES
   • Não se deve criar um atributo para o valor da chave estrangeira...
          – exemplo: private int idCategoria [ errado ! ]
   • Deve-se criar um atributo para o objeto relacionado...
          – exemplo: private Categoria categoriaProduto [ correto ! ]


   • A entidade alvo (Categoria) já deve estar mapeada
          – deve existir uma classe Categoria, com atributos e métodos get/set;
          – a classe Categoria deve estar mapeada - @Entity
          – os atributos da classe Categoria devem estar mapeados - @Column




                                                                            5
Programação II - Prof. Fernando dos Santos



   Relacionamento Muitos para Um
   Manipulações (1)
   • Criar novo produto (1) e nova categoria (2);
   • Associar categoria ao produto (3).
                                Produto prod = new Produto(); // (1)
                                prod.setNome("TV");
                                prod.setDescricao("TV LCD 40 Polegadas");
                                prod.setPrecoUnitario(999);

                                Categoria cat = new Categoria(); // (2)
                                cat.setNome("Eletrônicos");

                                prod.setCategoriaProduto(cat); // (3)

                                em.getTransaction().begin();
                                em.persist(cat); // (4)
                                em.persist(prod);
                                em.getTransaction().commit();
   • É necessário persistir a categoria e o produto (4)
                                                                            6
Programação II - Prof. Fernando dos Santos



   Relacionamento Muitos para Um
   Manipulações (2)
   • Criar novo produto (1); Associar categoria já existente (2);
                              Produto prod = new Produto(); // (1)
                              prod.setNome("Blu-Ray");
                              prod.setDescricao("Blu-Ray Player");
                              prod.setPrecoUnitario(150);

                              Categoria cat = em.find(Categoria.class, 1);

                              prod.setCategoriaProduto(cat);    // (2)

                              em.getTransaction().begin();
                              em.persist(prod); // (3)
                              em.getTransaction().commit();

   • É necessário persistir somente o produto (3)


                                                                             7
Programação II - Prof. Fernando dos Santos



   Relacionamento Muitos para Um
   Manipulações (3)
   • Trocar a categoria de um produto.
                             // No banco de dados, o produto 1 (TV)
                             // possui a categoria 1 (Eletrônicos)
                             Produto prod = em.find(Produto.class, 1);

                             // Buscar outra categoria (2-Informática)
                             Categoria cat = em.find(Categoria.class, 2);

                             em.getTransaction().begin();
                             // Trocar a categoria do produto
                             prod.setCategoriaProduto(cat); // (1)
                             em.getTransaction().commit();

   • O update será feito automáticamente no banco de dados (1)


                                                                            8
Programação II - Prof. Fernando dos Santos



   Relacionamento Muitos para Um
   Manipulações (4)
   • Buscar um produto (1)
     Produto prod = em.find(Produto.class, 1); // (1)

     System.out.println("Produto: "+prod.getNome());
     System.out.println("Categoria do Produto: "+prod.getCategoriaProduto().getNome());// (2)


   • A categoria é recuperada junto com o produto (2)
          – será impresso:
                Produto: TV
                Categoria do Produto: Informática




                                                                                          9
Programação II - Prof. Fernando dos Santos



   Relacionamento Muitos para Um
   Manipulações (5)
   • Buscar uma categoria que possui produtos (1)
   • Tentar remover a categoria (2)
                        Categoria cat = em.find(Categoria.class, 1); // (1)

                        em.getTransaction().begin();
                        em.remove(cat); // (2)
                        em.getTransaction().commit(); // (3)

   • O commit falhará, e será gerada exceção RollbackException (3)
 Exception in thread "main" javax.persistence.RollbackException: Error while commiting the transaction
            at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:71)
            at SistemaVendasManyToOneTestes.main(SistemaVendasManyToOneTestes.java:17)




                                                                                                 10
Programação II - Prof. Fernando dos Santos



   Relacionamento Muitos para Um
   Consultas (1)
   • Buscar todos os produtos de uma categoria (informada por parâmetro)
   •    Situação no banco de dados:                                     produto                           categoria
                                                      ID   Descrição                  ID Categoria   ID    Nome

                                                       1   TV LCD 40 Polegadas             1         1     Eletrônicos

                                                       2   Blu-Ray Player                  1         2     Informática

                                                       3   Notebook HP Pavilion            2         3     Livros

   • Consulta:
 Query cons = em.createQuery("select p from Produto p where p.categoriaProduto.id = :idCat");
 cons.setParameter("idCat", 1);
                                                                              O mapeamento
 List<Produto> produtos = cons.getResultList();                              pode ser utilizado
 for(Produto prod : produtos){                                                para fazer JOIN
    System.out.println("Cód: "+prod.getId()+" Descr: "+prod.getDescricao());   em consultas.
 }


   •    Resultado:                           ID   Descrição                 ID Categoria

                                             1    TV LCD 40 Polegadas             1

                                             2    Blu-Ray Player                  1                                 11
Programação II - Prof. Fernando dos Santos



   Relacionamento Muitos para Um
   Consultas (2) - OBSERVAÇÕES
   • Na query, usa-se o atributo da classe Produto
          – select p from Produto p where p.categoriaProduto.id ...


   • Não se usa o campo da tabela
          – select p from Produto p where p.id_categoria ... [ errado! ]

                                                                               modo correto!
                                                                               usar o atributo
 Query cons = em.createQuery("select p from Produto p where p.categoriaProduto.id = :idCat");
 cons.setParameter("idCat", 1);

 List<Produto> produtos = cons.getResultList();
 for(Produto prod : produtos){
    System.out.println("Cód: "+prod.getId()+" Descr: "+prod.getDescricao());
 }


                                                                                         12
Programação II - Prof. Fernando dos Santos



   Relacionamento Muitos para Um
   Consultas (3)
   • Buscar quantidade de produtos por categoria
   •     Situação no banco de dados:                           produto                         categoria
                                              ID   Descrição              ID Categoria   ID     Nome

                                               1   TV LCD 40 Polegadas         1         1      Eletrônicos

                                               2   Blu-Ray Player              1         2      Informática

                                               3   Notebook HP Pavilion        2         3      Livros

   •     Consulta:
       Query cons = em.createQuery("select p.categoriaProduto,
                                                 count(p)
                                            from Produto p
                                      group by p.categoriaProduto");
       List<Object[]> resultados = cons.getResultList(); // objetos retornados em um array
       for (Object[] result : resultados) {
          Categoria cat = (Categoria) result[0]; // posição [0] é a categoria
          Long qtd = (Long) result[1];              // posição [1] é a quantidade
          System.out.println("Categoria: " + cat.getNome() + ", Qtd: " + qtd);
       }

   •     Resultado:          Categoria: Eletrônicos, Qtd: 2          E as categorias que não          13
                             Categoria: Informática, Qtd: 1          possuem produtos?
Programação II - Prof. Fernando dos Santos



   Relacionamento Muitos para Um
   Consultas (4)
   • Buscar quantidade de produtos por categoria (TODAS)
   •    Situação no banco de dados:                           produto                        categoria
                                             ID   Descrição              ID Categoria   ID    Nome

                                             1    TV LCD 40 Polegadas         1         1     Eletrônicos

                                             2    Blu-Ray Player              1         2     Informática

                                             3    Notebook HP Pavilion        2         3     Livros

   •    Consulta: Query cons = em.createQuery("select c,
                                                            (select count(p)
                                                              from Produto p
                                                            where p.categoriaProduto = c)
                                                       from Categoria c");
                  List<Object[]> resultados = cons.getResultList(); // retornados em um array
                  for(Object[] result : resultados){
                     Categoria cat = (Categoria)result[0]; // posição [0] é a categoria
                     Long qtd = (Long)result[1];                // posição [1] é a quantidade
                     System.out.println("Categoria: "+cat.getNome()+", Qtd: "+qtd);
                  }
                      Categoria: Eletrônicos, Qtd: 2
   •    Resultado: Categoria: Informática, Qtd: 1
                                                                                              14
                      Categoria: Livros,        Qtd: 0
Programação II - Prof. Fernando dos Santos



   Relacionamento Muitos para Um
   Consultas (5)
   • Buscar categorias que não possuem produtos (subconsulta)
   •    Situação no banco de dados:                             produto                       categoria
                                             ID    Descrição              ID Categoria   ID    Nome

                                             1     TV LCD 40 Polegadas         1         1     Eletrônicos

                                             2     Blu-Ray Player              1         2     Informática

                                             3     Notebook HP Pavilion        2         3     Livros

   •    Consulta:
 Query cons = em.createQuery("select c
                                   from Categoria c
                                  where c not in ( select p.categoriaProduto from Produto p )");
 List<Categoria> categorias = cons.getResultList();
 for(Categoria cat : categorias){
    System.out.println("Cód: "+cat.getId()+" Nome: "+cat.getNome());
 }

   •    Resultado:                                ID   Nome

                                                  3    Livros
                                                                                                     15
Programação II - Prof. Fernando dos Santos




   Exercício
   • Criar o seguinte relacionamento Many-to-One:

                                                                               tipo do imóvel
                                                                               exemplos: casa,
                                                                                apartamento,
                                                                                  galpão...




   • Criar opções para:
          – incluir/editar/remover tipos de imóvel
          – ao cadastrar um imóvel, informar qual é o seu tipo
          – consultas:
                 • quantidade de imóveis por tipo (todos os tipos)
                 • tipos que não possuem imóveis
                 • todos os tipos, e para cada tipo, mostrar todos os imóveis do tipo
                                                                                             16
Programação II - Prof. Fernando dos Santos




   Bibliografia
   • BAUER, Christian; KING, Gavin. Java Persistence com
     Hibernate. Rio de Janeiro: Ciência Moderna, 2007. 844 p.

   • BURKE, Bill; MONSON-HAEFEL, Richard. Enterprise
     JavaBeans 3.0. 5.ed. São Paulo: Prentice Hall, 2007. 538 p.

   • The Java EE 6 Tutorial, parte VI (Persistence)
          – http://download.oracle.com/javaee/6/tutorial/doc/




                                                                   17

Weitere ähnliche Inhalte

Andere mochten auch

Trabajo colaborativo 1 redes medios de transmision 301125 5
Trabajo colaborativo 1 redes medios de transmision 301125 5Trabajo colaborativo 1 redes medios de transmision 301125 5
Trabajo colaborativo 1 redes medios de transmision 301125 5jsmachadob
 
El cotxe
El cotxeEl cotxe
El cotxecarmen
 
Rich. cigs 18 03-13
Rich. cigs 18 03-13Rich. cigs 18 03-13
Rich. cigs 18 03-13rsusirti
 
Funciones Del Maestro
Funciones Del MaestroFunciones Del Maestro
Funciones Del Maestrololimusica
 
Bikini14
Bikini14Bikini14
Bikini14rusgirl
 
Esbozo de las revoluciones busgueses
Esbozo de las revoluciones busguesesEsbozo de las revoluciones busgueses
Esbozo de las revoluciones busguesesDarkshadows418
 
e-learning kitchen II, Marina Litvinova
e-learning kitchen II, Marina Litvinovae-learning kitchen II, Marina Litvinova
e-learning kitchen II, Marina LitvinovaMarina Litvinova
 
Resultados sábado
Resultados sábadoResultados sábado
Resultados sábadoJordi Masnou
 
Apresentação 2º semestre 2012 eliane
Apresentação 2º semestre 2012 elianeApresentação 2º semestre 2012 eliane
Apresentação 2º semestre 2012 elianeEldes75
 
Cr2 apresentacao 1_t09_port
Cr2 apresentacao 1_t09_portCr2 apresentacao 1_t09_port
Cr2 apresentacao 1_t09_portSiteriCR2
 
Bikini31
Bikini31Bikini31
Bikini31rusgirl
 

Andere mochten auch (20)

Introduction to social media
Introduction to social mediaIntroduction to social media
Introduction to social media
 
70 sache islami waqiat
70 sache islami waqiat70 sache islami waqiat
70 sache islami waqiat
 
Trabajo colaborativo 1 redes medios de transmision 301125 5
Trabajo colaborativo 1 redes medios de transmision 301125 5Trabajo colaborativo 1 redes medios de transmision 301125 5
Trabajo colaborativo 1 redes medios de transmision 301125 5
 
El cotxe
El cotxeEl cotxe
El cotxe
 
Rich. cigs 18 03-13
Rich. cigs 18 03-13Rich. cigs 18 03-13
Rich. cigs 18 03-13
 
Funciones Del Maestro
Funciones Del MaestroFunciones Del Maestro
Funciones Del Maestro
 
Bikini14
Bikini14Bikini14
Bikini14
 
Patente us4593647
Patente us4593647Patente us4593647
Patente us4593647
 
Esbozo de las revoluciones busgueses
Esbozo de las revoluciones busguesesEsbozo de las revoluciones busgueses
Esbozo de las revoluciones busgueses
 
e-learning kitchen II, Marina Litvinova
e-learning kitchen II, Marina Litvinovae-learning kitchen II, Marina Litvinova
e-learning kitchen II, Marina Litvinova
 
Resultados sábado
Resultados sábadoResultados sábado
Resultados sábado
 
Bikini3
Bikini3Bikini3
Bikini3
 
Apresentação 2º semestre 2012 eliane
Apresentação 2º semestre 2012 elianeApresentação 2º semestre 2012 eliane
Apresentação 2º semestre 2012 eliane
 
Reproducción asexual
Reproducción asexualReproducción asexual
Reproducción asexual
 
Oferta institucional
Oferta institucionalOferta institucional
Oferta institucional
 
Cr2 apresentacao 1_t09_port
Cr2 apresentacao 1_t09_portCr2 apresentacao 1_t09_port
Cr2 apresentacao 1_t09_port
 
Bikini6
Bikini6Bikini6
Bikini6
 
51.maio 2013 revista
51.maio 2013 revista51.maio 2013 revista
51.maio 2013 revista
 
Bikini31
Bikini31Bikini31
Bikini31
 
Hazrat salman-farsi
Hazrat salman-farsiHazrat salman-farsi
Hazrat salman-farsi
 

Ähnlich wie JPA Mapeamento Relacionamento Muitos para Um

4 2-jpa-relacionamentos-one-to-many
4 2-jpa-relacionamentos-one-to-many4 2-jpa-relacionamentos-one-to-many
4 2-jpa-relacionamentos-one-to-manyLukinha92
 
2 1-jpa-mapeamento-simples
2 1-jpa-mapeamento-simples2 1-jpa-mapeamento-simples
2 1-jpa-mapeamento-simplesLukinha92
 
3 jpa-consultas
3 jpa-consultas3 jpa-consultas
3 jpa-consultasLukinha92
 
3 jpa-consultas
3 jpa-consultas3 jpa-consultas
3 jpa-consultasLukinha92
 
5 jpa-heranca
5 jpa-heranca5 jpa-heranca
5 jpa-herancaLukinha92
 
5 jpa-heranca
5 jpa-heranca5 jpa-heranca
5 jpa-herancaLukinha92
 
Como conectar programas em linguagem java a bases de dados
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dadosHenrique Fernandes
 
Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3Thyago Maia
 
Introdução à análise orientada a objetos parte 2
Introdução à análise orientada a objetos parte 2Introdução à análise orientada a objetos parte 2
Introdução à análise orientada a objetos parte 2irenescotolo
 
Java - Introdução a banco de dados
Java - Introdução a banco de dadosJava - Introdução a banco de dados
Java - Introdução a banco de dadosSérgio Souza Costa
 
Python: Iteraveis, geradores etc
Python: Iteraveis, geradores etcPython: Iteraveis, geradores etc
Python: Iteraveis, geradores etcLuciano Ramalho
 
Java aprendendo linguagem.ppt
Java aprendendo linguagem.pptJava aprendendo linguagem.ppt
Java aprendendo linguagem.pptEmerson Cardoso
 
Curso de Ruby on Rails - Aula 02
Curso de Ruby on Rails - Aula 02Curso de Ruby on Rails - Aula 02
Curso de Ruby on Rails - Aula 02Maurício Linhares
 

Ähnlich wie JPA Mapeamento Relacionamento Muitos para Um (20)

4 2-jpa-relacionamentos-one-to-many
4 2-jpa-relacionamentos-one-to-many4 2-jpa-relacionamentos-one-to-many
4 2-jpa-relacionamentos-one-to-many
 
2 1-jpa-mapeamento-simples
2 1-jpa-mapeamento-simples2 1-jpa-mapeamento-simples
2 1-jpa-mapeamento-simples
 
3 jpa-consultas
3 jpa-consultas3 jpa-consultas
3 jpa-consultas
 
3 jpa-consultas
3 jpa-consultas3 jpa-consultas
3 jpa-consultas
 
5 jpa-heranca
5 jpa-heranca5 jpa-heranca
5 jpa-heranca
 
5 jpa-heranca
5 jpa-heranca5 jpa-heranca
5 jpa-heranca
 
Java7
Java7Java7
Java7
 
Git, GitHub e OO
Git, GitHub e OOGit, GitHub e OO
Git, GitHub e OO
 
Como conectar programas em linguagem java a bases de dados
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dados
 
Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3
 
Introdução à análise orientada a objetos parte 2
Introdução à análise orientada a objetos parte 2Introdução à análise orientada a objetos parte 2
Introdução à análise orientada a objetos parte 2
 
Java - Introdução a banco de dados
Java - Introdução a banco de dadosJava - Introdução a banco de dados
Java - Introdução a banco de dados
 
Java AWT
Java AWTJava AWT
Java AWT
 
Vraptor
VraptorVraptor
Vraptor
 
padrao de projeto3
padrao de projeto3padrao de projeto3
padrao de projeto3
 
Lista Exercicios 02
Lista Exercicios 02Lista Exercicios 02
Lista Exercicios 02
 
Python: Iteraveis, geradores etc
Python: Iteraveis, geradores etcPython: Iteraveis, geradores etc
Python: Iteraveis, geradores etc
 
Doctrine for dummies
Doctrine for dummiesDoctrine for dummies
Doctrine for dummies
 
Java aprendendo linguagem.ppt
Java aprendendo linguagem.pptJava aprendendo linguagem.ppt
Java aprendendo linguagem.ppt
 
Curso de Ruby on Rails - Aula 02
Curso de Ruby on Rails - Aula 02Curso de Ruby on Rails - Aula 02
Curso de Ruby on Rails - Aula 02
 

JPA Mapeamento Relacionamento Muitos para Um

  • 1. Programação II - Prof. Fernando dos Santos Java Persistence API (JPA) Mapeamento de Relacionamentos Fernando dos Santos fernando.santos@udesc.br
  • 2. Programação II - Prof. Fernando dos Santos Mapeamento de Relacionamentos Associação, Agregação, Composição • Tipos de Relacionamentos mapeáveis: – Um para Um Produto – Muitos para Um Categoria - id: int – Um para Muitos - nome: String - id: int - descricao: String 0..* 1 - nome: String - precoUnitario: float + métodos get()/set() : void 2
  • 3. Programação II - Prof. Fernando dos Santos Relacionamento Muitos para Um Mapeamento • Muitos produtos estão associados à uma categoria. • Entidade Produto possui atributo para associar com Categoria – na tabela: coluna id_categoria INT (chave estrangeira) – na classe: atributo categoriaProduto do tipo Categoria (classe) • O mapeamento é definido na entidade “muitos” (que possui a chave estrangeira) - Produto 3
  • 4. Programação II - Prof. Fernando dos Santos Relacionamento Muitos para Um Mapeamento com anotações @ManyToOne e @JoinColumn @Entity @Table(name=“produto") public class Produto implements Serializable { @Id @GeneratedValue private int id; @Column(name="nome") private String nome; @Column(name=“descricao") private String senha; @Column(name=“valor_unitario") private float precoUnitario; @ManyToOne @JoinColumn(name="id_categoria", nullable=false) private Categoria categoriaProduto; } 4
  • 5. Programação II - Prof. Fernando dos Santos Relacionamento Muitos para Um Anotações @ManyToOne e @JoinColumn - OBSERVAÇÕES • Não se deve criar um atributo para o valor da chave estrangeira... – exemplo: private int idCategoria [ errado ! ] • Deve-se criar um atributo para o objeto relacionado... – exemplo: private Categoria categoriaProduto [ correto ! ] • A entidade alvo (Categoria) já deve estar mapeada – deve existir uma classe Categoria, com atributos e métodos get/set; – a classe Categoria deve estar mapeada - @Entity – os atributos da classe Categoria devem estar mapeados - @Column 5
  • 6. Programação II - Prof. Fernando dos Santos Relacionamento Muitos para Um Manipulações (1) • Criar novo produto (1) e nova categoria (2); • Associar categoria ao produto (3). Produto prod = new Produto(); // (1) prod.setNome("TV"); prod.setDescricao("TV LCD 40 Polegadas"); prod.setPrecoUnitario(999); Categoria cat = new Categoria(); // (2) cat.setNome("Eletrônicos"); prod.setCategoriaProduto(cat); // (3) em.getTransaction().begin(); em.persist(cat); // (4) em.persist(prod); em.getTransaction().commit(); • É necessário persistir a categoria e o produto (4) 6
  • 7. Programação II - Prof. Fernando dos Santos Relacionamento Muitos para Um Manipulações (2) • Criar novo produto (1); Associar categoria já existente (2); Produto prod = new Produto(); // (1) prod.setNome("Blu-Ray"); prod.setDescricao("Blu-Ray Player"); prod.setPrecoUnitario(150); Categoria cat = em.find(Categoria.class, 1); prod.setCategoriaProduto(cat); // (2) em.getTransaction().begin(); em.persist(prod); // (3) em.getTransaction().commit(); • É necessário persistir somente o produto (3) 7
  • 8. Programação II - Prof. Fernando dos Santos Relacionamento Muitos para Um Manipulações (3) • Trocar a categoria de um produto. // No banco de dados, o produto 1 (TV) // possui a categoria 1 (Eletrônicos) Produto prod = em.find(Produto.class, 1); // Buscar outra categoria (2-Informática) Categoria cat = em.find(Categoria.class, 2); em.getTransaction().begin(); // Trocar a categoria do produto prod.setCategoriaProduto(cat); // (1) em.getTransaction().commit(); • O update será feito automáticamente no banco de dados (1) 8
  • 9. Programação II - Prof. Fernando dos Santos Relacionamento Muitos para Um Manipulações (4) • Buscar um produto (1) Produto prod = em.find(Produto.class, 1); // (1) System.out.println("Produto: "+prod.getNome()); System.out.println("Categoria do Produto: "+prod.getCategoriaProduto().getNome());// (2) • A categoria é recuperada junto com o produto (2) – será impresso: Produto: TV Categoria do Produto: Informática 9
  • 10. Programação II - Prof. Fernando dos Santos Relacionamento Muitos para Um Manipulações (5) • Buscar uma categoria que possui produtos (1) • Tentar remover a categoria (2) Categoria cat = em.find(Categoria.class, 1); // (1) em.getTransaction().begin(); em.remove(cat); // (2) em.getTransaction().commit(); // (3) • O commit falhará, e será gerada exceção RollbackException (3) Exception in thread "main" javax.persistence.RollbackException: Error while commiting the transaction at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:71) at SistemaVendasManyToOneTestes.main(SistemaVendasManyToOneTestes.java:17) 10
  • 11. Programação II - Prof. Fernando dos Santos Relacionamento Muitos para Um Consultas (1) • Buscar todos os produtos de uma categoria (informada por parâmetro) • Situação no banco de dados: produto categoria ID Descrição ID Categoria ID Nome 1 TV LCD 40 Polegadas 1 1 Eletrônicos 2 Blu-Ray Player 1 2 Informática 3 Notebook HP Pavilion 2 3 Livros • Consulta: Query cons = em.createQuery("select p from Produto p where p.categoriaProduto.id = :idCat"); cons.setParameter("idCat", 1); O mapeamento List<Produto> produtos = cons.getResultList(); pode ser utilizado for(Produto prod : produtos){ para fazer JOIN System.out.println("Cód: "+prod.getId()+" Descr: "+prod.getDescricao()); em consultas. } • Resultado: ID Descrição ID Categoria 1 TV LCD 40 Polegadas 1 2 Blu-Ray Player 1 11
  • 12. Programação II - Prof. Fernando dos Santos Relacionamento Muitos para Um Consultas (2) - OBSERVAÇÕES • Na query, usa-se o atributo da classe Produto – select p from Produto p where p.categoriaProduto.id ... • Não se usa o campo da tabela – select p from Produto p where p.id_categoria ... [ errado! ] modo correto! usar o atributo Query cons = em.createQuery("select p from Produto p where p.categoriaProduto.id = :idCat"); cons.setParameter("idCat", 1); List<Produto> produtos = cons.getResultList(); for(Produto prod : produtos){ System.out.println("Cód: "+prod.getId()+" Descr: "+prod.getDescricao()); } 12
  • 13. Programação II - Prof. Fernando dos Santos Relacionamento Muitos para Um Consultas (3) • Buscar quantidade de produtos por categoria • Situação no banco de dados: produto categoria ID Descrição ID Categoria ID Nome 1 TV LCD 40 Polegadas 1 1 Eletrônicos 2 Blu-Ray Player 1 2 Informática 3 Notebook HP Pavilion 2 3 Livros • Consulta: Query cons = em.createQuery("select p.categoriaProduto, count(p) from Produto p group by p.categoriaProduto"); List<Object[]> resultados = cons.getResultList(); // objetos retornados em um array for (Object[] result : resultados) { Categoria cat = (Categoria) result[0]; // posição [0] é a categoria Long qtd = (Long) result[1]; // posição [1] é a quantidade System.out.println("Categoria: " + cat.getNome() + ", Qtd: " + qtd); } • Resultado: Categoria: Eletrônicos, Qtd: 2 E as categorias que não 13 Categoria: Informática, Qtd: 1 possuem produtos?
  • 14. Programação II - Prof. Fernando dos Santos Relacionamento Muitos para Um Consultas (4) • Buscar quantidade de produtos por categoria (TODAS) • Situação no banco de dados: produto categoria ID Descrição ID Categoria ID Nome 1 TV LCD 40 Polegadas 1 1 Eletrônicos 2 Blu-Ray Player 1 2 Informática 3 Notebook HP Pavilion 2 3 Livros • Consulta: Query cons = em.createQuery("select c, (select count(p) from Produto p where p.categoriaProduto = c) from Categoria c"); List<Object[]> resultados = cons.getResultList(); // retornados em um array for(Object[] result : resultados){ Categoria cat = (Categoria)result[0]; // posição [0] é a categoria Long qtd = (Long)result[1]; // posição [1] é a quantidade System.out.println("Categoria: "+cat.getNome()+", Qtd: "+qtd); } Categoria: Eletrônicos, Qtd: 2 • Resultado: Categoria: Informática, Qtd: 1 14 Categoria: Livros, Qtd: 0
  • 15. Programação II - Prof. Fernando dos Santos Relacionamento Muitos para Um Consultas (5) • Buscar categorias que não possuem produtos (subconsulta) • Situação no banco de dados: produto categoria ID Descrição ID Categoria ID Nome 1 TV LCD 40 Polegadas 1 1 Eletrônicos 2 Blu-Ray Player 1 2 Informática 3 Notebook HP Pavilion 2 3 Livros • Consulta: Query cons = em.createQuery("select c from Categoria c where c not in ( select p.categoriaProduto from Produto p )"); List<Categoria> categorias = cons.getResultList(); for(Categoria cat : categorias){ System.out.println("Cód: "+cat.getId()+" Nome: "+cat.getNome()); } • Resultado: ID Nome 3 Livros 15
  • 16. Programação II - Prof. Fernando dos Santos Exercício • Criar o seguinte relacionamento Many-to-One: tipo do imóvel exemplos: casa, apartamento, galpão... • Criar opções para: – incluir/editar/remover tipos de imóvel – ao cadastrar um imóvel, informar qual é o seu tipo – consultas: • quantidade de imóveis por tipo (todos os tipos) • tipos que não possuem imóveis • todos os tipos, e para cada tipo, mostrar todos os imóveis do tipo 16
  • 17. Programação II - Prof. Fernando dos Santos Bibliografia • BAUER, Christian; KING, Gavin. Java Persistence com Hibernate. Rio de Janeiro: Ciência Moderna, 2007. 844 p. • BURKE, Bill; MONSON-HAEFEL, Richard. Enterprise JavaBeans 3.0. 5.ed. São Paulo: Prentice Hall, 2007. 538 p. • The Java EE 6 Tutorial, parte VI (Persistence) – http://download.oracle.com/javaee/6/tutorial/doc/ 17