Programação Orientada a Objetos


       Estudo de Frameworks
(Mapeamento Objeto-Relacional em Java)

  Objetivo: Identificar os processos de
   mapeamento Objeto-Relacional
       Prof. Nécio de Lima Veras
Parte III
Mapeamento de Relacionamentos
Atributos compostos

• Se a entidade possuir um atributos que,
  em sua abstração, deve ser dividido em
  outros campos, então usa-se a anotação
  @Embeddable
• Ou seja, este campo, na verdade foi
  promovido à classe;
Visualizando Relações

• Se a entidade possuir uma propriedade
  composta cujo tipo é uma outra entidade:
   – use a anotação @OneToOne em uma propriedade do
    tipo correspondente;
  – Em associações one-to-one bidirecionais, usamos o
    atributo mappedBy para explicitar o lado não
    proprietário da associação.
Entendendo
Empresa




    Diretor
Mais Exemplos
@Entity
public class Cliente {
    ...
    @OneToOne
    @JoinColumn(name="iConjugeId", unique=true,
                nullable=false, updatable=false)
    public Conjuge conjuge;
    ...
}



         @Entity
         public class Conjuge {
             ...
             @OneToOne(mappedBy="conjuge")
             public Cliente cliente;
             ...
         }
Prática
Relacionamento
                         de muitos para um
●   Se a entidade faz parte de uma coleção de
    entidades de outras entidades:
    ●   Use a anotação @ManyToOne para uma
        propriedade que representará a entidade dona
        da coleção;
Outro Exemplo



@Entity
public class Pedido {
    ...
    @ManyToOne
    @JoinColumn(name="ClienteID", nullable=false)
    private Cliente cliente;
    ...
}
De um para muitos

• Se a entidade possui uma coleção de outras
  entidades:
  – Use a anotação @OneToMany para uma propriedade
    que representará a coleção;
Mais um exemplo



@Entity
public class Cliente {
    ...
    @OneToMany(cascade=ALL, mappedBy="cliente")
    private Set<Pedido> pedidos;
    ...
}
Observações

• Em caso de associações bidirecionais, em uma
  classe temos um atributo OneToMany e na outra
  classe (a que detém a chave estrangeira) temos
  um atributo ManyToOne.
   – No lado OneToMany de uma associação
     bidirecional, usamos o atributo mappedBy para
     explicitar que o relacionamento (chave
     estrangeira) fica no lado oposto (inverso) da
     associação.
Prática
De muitos para muitos

• Se duas entidades possuem coleções umas das
  outras:
  – Então ambas entidades terão propriedades de coleção
    com a anotação @ManyToMany;
Visualizando
@ManyToMany
Outro exemplo
@Entity
public class Cliente {
    ...
  @ManyToMany
  @JoinTable(
    name="PhoneCli",
    joinColumns=
      @JoinColumn(name="iCli_ID", referencedColumnName="ID"),
    inverseJoinColumns=
      @JoinColumn(name="iFone_ID", referencedColumnName="ID")
  )
  private Set<Telefone> fones;
  ...
}


        @Entity
        public class Telefone {
            ...
            @ManyToMany(mappedBy="fones")
            private Set<Cliente> clientes;
            ...
        }
Considerações

• Novamente, o mappedBy fica do lado não
  proprietário da associação e é usado em
  associações bidirecionais.
• Prática:
ManyToMany com atributo

• E se caso a associação N:N possuir um
  (ou mais) atributo(s) intermediário(s) não-
  chave?

• Solução:
  1.Mapear a classe N:N;
  2.Criar uma classe está-
    tica interna com suas
    chaves.
  3.Criar as relações “ManyToOne” com as tabelas
    que fornecem as chaves.
Visualizando em termos de
          código

         @Embeddable
         private static class Id {

             @Column (name = "idAviao")
             private int idAviao;

             @Column (name = "idAeroporto")
             private int idAeroporto;

             public int getIdAviao() {
                    return idAviao;
             }

             public void setIdAviao(int idAviao) {
                    this.idAviao = idAviao;
             }

             public int getIdAeroporto() {
                    return idAeroporto;
             }

             public void setIdAeroporto(int
             idAeroporto) {
                    this.idAeroporto = idAeroporto;
             }
         }
Cascateamento
•   O cascateamento pode ser usado para propagar operações para
    classes associadas;
•   Tipos:
     – ALL – Todas as operações possíveis são cascateadas para as
       classes associadas.
     – MERGE – Se a entidade fonte estiver “merged”, o merge é
       cascateado para as classes associadas.
     – PERSIST – Se a entidade fonte for persistida, a persistência é
       cascateada para as classes associadas.
     – REFRESH – Se a entidade fonte for atualizada, a atualização é
       cascateada para as classes associadas.
     – REMOVE – Se a entidade fonte for removida, as classes
       associadas também serão removidas.
• Exemplo:
@OneToMany(cascade={CascadeType.REMOVE})
private List<Pessoa> dependentes;
Carregando as Associações

•   A associações podem ser carregadas de duas formas:
     – EAGER – A associação é carregada juntamente com a classe
       base.

          @OneToMany(fetch=FetchType.EAGER)

    – LAZY – A associação somente é carregada quando for usada.

        • @OneToMany(fetch=FetchType.LAZY)

•   Em associações ManyToOne e OneToOne, EAGER é padrão.
•   Em associações OneToMany e ManyToMany, LAZY é padrão.
     – As coleções só são inicializadas quando houver necessidade;
     – Apenas quando algum método que acesse o conteúdo da coleção
       for executado é que ela será preenchida;
Prática

• Atualize as classes anteriores conforme o
  diagrama abaixo:

Mais conteúdo relacionado

ODP
Mapeamento de herança OR
ODP
Processos iniciais do mapeamento OR
ODP
Anotações do mapeamento OR
ODP
Hibernate-consultas
PPT
JPA - Java Persistence API
PDF
JPA com Hibernate
PDF
Introdução ao JPA com Hibernate
PPT
Jpa – Java Persistence Api
Mapeamento de herança OR
Processos iniciais do mapeamento OR
Anotações do mapeamento OR
Hibernate-consultas
JPA - Java Persistence API
JPA com Hibernate
Introdução ao JPA com Hibernate
Jpa – Java Persistence Api

Mais procurados (20)

PDF
Hibernate conceitos
PDF
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
PPTX
Curso Java Básico - Aula02
PPTX
Curso Java Básico - Aula 04
PPTX
Curso Java Básico - Aula 03
PDF
Introdução a JPA (2010)
PPTX
PDF
2 1-jpa-mapeamento-simples
PPT
http://www.dm.ufscar.br/~waldeck/curso/java/
PDF
Java 02
PDF
Curso java 03 - métodos e parâmetros
PPT
Desenvolvimento Agil Com Doctrine Orm
PDF
Apostila hibernate
PPTX
Java: Manipulação de Arquivos
PDF
Spring Data Jpa
PDF
Abstração do banco de dados com PHP Doctrine
ODP
Slide Share s2 Rodd
ODP
Slide Semana2 Rodrigo2
PDF
Exercícios de programação orientado a objeto
Hibernate conceitos
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Curso Java Básico - Aula02
Curso Java Básico - Aula 04
Curso Java Básico - Aula 03
Introdução a JPA (2010)
2 1-jpa-mapeamento-simples
http://www.dm.ufscar.br/~waldeck/curso/java/
Java 02
Curso java 03 - métodos e parâmetros
Desenvolvimento Agil Com Doctrine Orm
Apostila hibernate
Java: Manipulação de Arquivos
Spring Data Jpa
Abstração do banco de dados com PHP Doctrine
Slide Share s2 Rodd
Slide Semana2 Rodrigo2
Exercícios de programação orientado a objeto
Anúncio

Semelhante a Relacionamentos do mapeamento OR (20)

PPT
Course Hibernate 2008
PDF
Java persintence api
PPTX
PPTX
Mapeamento Objeto-Relacional com Java Persistence API
PPTX
Curso jpa java persistence API
PDF
Persistência JPA
PPTX
Persistência com JPA e Hibernate
PDF
JPA - MGJUG
PDF
2 1-jpa-mapeamento-simples
PDF
PDF
4 2-jpa-relacionamentos-one-to-many
PDF
4 2-jpa-relacionamentos-one-to-many
PPT
Aula JPA
PDF
Treinamento ORM .Net
PPT
Curso De Hibernate 3
PDF
Curso de Java (Parte 5)
PPT
Introdução a JPA e Hibernate - TDC 2012
PPTX
ORM: Sendo produtivo com NHibernate
PDF
J530 11 relationships
Course Hibernate 2008
Java persintence api
Mapeamento Objeto-Relacional com Java Persistence API
Curso jpa java persistence API
Persistência JPA
Persistência com JPA e Hibernate
JPA - MGJUG
2 1-jpa-mapeamento-simples
4 2-jpa-relacionamentos-one-to-many
4 2-jpa-relacionamentos-one-to-many
Aula JPA
Treinamento ORM .Net
Curso De Hibernate 3
Curso de Java (Parte 5)
Introdução a JPA e Hibernate - TDC 2012
ORM: Sendo produtivo com NHibernate
J530 11 relationships
Anúncio

Mais de Nécio de Lima Veras (20)

PDF
Introdução ao JavaFX
PDF
Introdução à analise e complexidade de algoritmos
PDF
Teste de software
PDF
Versionamento com git
PDF
Uma Abordagem Baseada em Agentes para Planejamento e Monitoramento de Serviço...
PDF
Introdução à Engenharia de Software Orientada a Agentes com JaCaMo
PDF
Jason: Componentes personalizados
PDF
Agentes inteligentes com jason
PDF
Ambientes em Sistemas Multi-agentes
PDF
Arquiteturas concretas de agentes inteligentes - bdi agents
PDF
Revisão de matemática
PDF
Especificações iniciais de agentes inteligentes
ODP
Notas sobre agentes inteligentes
PDF
PDF
Introdução à linguagem UML
PDF
Introdução aos Sistemas operacionais
PDF
Organizando um Repositório de Objetos de Aprendizagem para dispositivos móvei...
PDF
Classes abstratas e interfaces
PDF
Desenvolvimento ágil de software
PDF
Internet: conceitos e segurança
Introdução ao JavaFX
Introdução à analise e complexidade de algoritmos
Teste de software
Versionamento com git
Uma Abordagem Baseada em Agentes para Planejamento e Monitoramento de Serviço...
Introdução à Engenharia de Software Orientada a Agentes com JaCaMo
Jason: Componentes personalizados
Agentes inteligentes com jason
Ambientes em Sistemas Multi-agentes
Arquiteturas concretas de agentes inteligentes - bdi agents
Revisão de matemática
Especificações iniciais de agentes inteligentes
Notas sobre agentes inteligentes
Introdução à linguagem UML
Introdução aos Sistemas operacionais
Organizando um Repositório de Objetos de Aprendizagem para dispositivos móvei...
Classes abstratas e interfaces
Desenvolvimento ágil de software
Internet: conceitos e segurança

Relacionamentos do mapeamento OR

  • 1. Programação Orientada a Objetos Estudo de Frameworks (Mapeamento Objeto-Relacional em Java) Objetivo: Identificar os processos de mapeamento Objeto-Relacional Prof. Nécio de Lima Veras
  • 2. Parte III Mapeamento de Relacionamentos
  • 3. Atributos compostos • Se a entidade possuir um atributos que, em sua abstração, deve ser dividido em outros campos, então usa-se a anotação @Embeddable • Ou seja, este campo, na verdade foi promovido à classe;
  • 4. Visualizando Relações • Se a entidade possuir uma propriedade composta cujo tipo é uma outra entidade: – use a anotação @OneToOne em uma propriedade do tipo correspondente; – Em associações one-to-one bidirecionais, usamos o atributo mappedBy para explicitar o lado não proprietário da associação.
  • 6. Mais Exemplos @Entity public class Cliente { ... @OneToOne @JoinColumn(name="iConjugeId", unique=true, nullable=false, updatable=false) public Conjuge conjuge; ... } @Entity public class Conjuge { ... @OneToOne(mappedBy="conjuge") public Cliente cliente; ... }
  • 8. Relacionamento de muitos para um ● Se a entidade faz parte de uma coleção de entidades de outras entidades: ● Use a anotação @ManyToOne para uma propriedade que representará a entidade dona da coleção;
  • 9. Outro Exemplo @Entity public class Pedido { ... @ManyToOne @JoinColumn(name="ClienteID", nullable=false) private Cliente cliente; ... }
  • 10. De um para muitos • Se a entidade possui uma coleção de outras entidades: – Use a anotação @OneToMany para uma propriedade que representará a coleção;
  • 11. Mais um exemplo @Entity public class Cliente { ... @OneToMany(cascade=ALL, mappedBy="cliente") private Set<Pedido> pedidos; ... }
  • 12. Observações • Em caso de associações bidirecionais, em uma classe temos um atributo OneToMany e na outra classe (a que detém a chave estrangeira) temos um atributo ManyToOne. – No lado OneToMany de uma associação bidirecional, usamos o atributo mappedBy para explicitar que o relacionamento (chave estrangeira) fica no lado oposto (inverso) da associação.
  • 14. De muitos para muitos • Se duas entidades possuem coleções umas das outras: – Então ambas entidades terão propriedades de coleção com a anotação @ManyToMany;
  • 16. Outro exemplo @Entity public class Cliente { ... @ManyToMany @JoinTable( name="PhoneCli", joinColumns= @JoinColumn(name="iCli_ID", referencedColumnName="ID"), inverseJoinColumns= @JoinColumn(name="iFone_ID", referencedColumnName="ID") ) private Set<Telefone> fones; ... } @Entity public class Telefone { ... @ManyToMany(mappedBy="fones") private Set<Cliente> clientes; ... }
  • 17. Considerações • Novamente, o mappedBy fica do lado não proprietário da associação e é usado em associações bidirecionais. • Prática:
  • 18. ManyToMany com atributo • E se caso a associação N:N possuir um (ou mais) atributo(s) intermediário(s) não- chave? • Solução: 1.Mapear a classe N:N; 2.Criar uma classe está- tica interna com suas chaves. 3.Criar as relações “ManyToOne” com as tabelas que fornecem as chaves.
  • 19. Visualizando em termos de código @Embeddable private static class Id { @Column (name = "idAviao") private int idAviao; @Column (name = "idAeroporto") private int idAeroporto; public int getIdAviao() { return idAviao; } public void setIdAviao(int idAviao) { this.idAviao = idAviao; } public int getIdAeroporto() { return idAeroporto; } public void setIdAeroporto(int idAeroporto) { this.idAeroporto = idAeroporto; } }
  • 20. Cascateamento • O cascateamento pode ser usado para propagar operações para classes associadas; • Tipos: – ALL – Todas as operações possíveis são cascateadas para as classes associadas. – MERGE – Se a entidade fonte estiver “merged”, o merge é cascateado para as classes associadas. – PERSIST – Se a entidade fonte for persistida, a persistência é cascateada para as classes associadas. – REFRESH – Se a entidade fonte for atualizada, a atualização é cascateada para as classes associadas. – REMOVE – Se a entidade fonte for removida, as classes associadas também serão removidas. • Exemplo: @OneToMany(cascade={CascadeType.REMOVE}) private List<Pessoa> dependentes;
  • 21. Carregando as Associações • A associações podem ser carregadas de duas formas: – EAGER – A associação é carregada juntamente com a classe base. @OneToMany(fetch=FetchType.EAGER) – LAZY – A associação somente é carregada quando for usada. • @OneToMany(fetch=FetchType.LAZY) • Em associações ManyToOne e OneToOne, EAGER é padrão. • Em associações OneToMany e ManyToMany, LAZY é padrão. – As coleções só são inicializadas quando houver necessidade; – Apenas quando algum método que acesse o conteúdo da coleção for executado é que ela será preenchida;
  • 22. Prática • Atualize as classes anteriores conforme o diagrama abaixo: