Relacionamentos do mapeamento OR

Embed Size (px)

Citation preview

  • 1. Programao Orientada a Objetos Estudo de Frameworks(Mapeamento Objeto-Relacional em Java)Objetivo: Identificar os processos de mapeamento Objeto-Relacional Prof. Ncio de Lima Veras

2. Parte IIIMapeamento de Relacionamentos 3. Atributos compostos Se a entidade possuir um atributos que,em sua abstrao, deve ser dividido emoutros campos, ento usa-se a anotao@Embeddable Ou seja, este campo, na verdade foipromovido classe; 4. Visualizando Relaes Se a entidade possuir uma propriedadecomposta cujo tipo uma outra entidade: use a anotao @OneToOne em uma propriedade dotipo correspondente; Em associaes one-to-one bidirecionais, usamos oatributo mappedBy para explicitar o lado noproprietrio da associao. 5. EntendendoEmpresaDiretor 6. Mais Exemplos@Entitypublic 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; ... } 7. Prtica 8. Relacionamento de muitos para um Se a entidade faz parte de uma coleo deentidades de outras entidades: Use a anotao @ManyToOne para umapropriedade que representar a entidade donada coleo; 9. Outro Exemplo@Entitypublic class Pedido {...@ManyToOne@JoinColumn(name="ClienteID", nullable=false)private Cliente cliente;...} 10. De um para muitos Se a entidade possui uma coleo de outrasentidades: Use a anotao @OneToMany para uma propriedadeque representar a coleo; 11. Mais um exemplo@Entitypublic class Cliente {...@OneToMany(cascade=ALL, mappedBy="cliente")private Set pedidos;...} 12. Observaes Em caso de associaes bidirecionais, em umaclasse temos um atributo OneToMany e na outraclasse (a que detm a chave estrangeira) temosum atributo ManyToOne. No lado OneToMany de uma associao bidirecional, usamos o atributo mappedBy para explicitar que o relacionamento (chave estrangeira) fica no lado oposto (inverso) da associao. 13. Prtica 14. De muitos para muitos Se duas entidades possuem colees umas dasoutras: Ento ambas entidades tero propriedades de coleocom a anotao @ManyToMany; 15. Visualizando@ManyToMany 16. Outro exemplo@Entitypublic class Cliente {...@ManyToMany@JoinTable(name="PhoneCli",joinColumns=@JoinColumn(name="iCli_ID", referencedColumnName="ID"),inverseJoinColumns=@JoinColumn(name="iFone_ID", referencedColumnName="ID"))private Set fones;...}@Entitypublic class Telefone {...@ManyToMany(mappedBy="fones")private Set clientes;...} 17. Consideraes Novamente, o mappedBy fica do lado noproprietrio da associao e usado emassociaes bidirecionais. Prtica: 18. ManyToMany com atributo E se caso a associao N:N possuir um(ou mais) atributo(s) intermedirio(s) no-chave? Soluo:1.Mapear a classe N:N;2.Criar uma classe est-tica interna com suaschaves.3.Criar as relaes ManyToOne com as tabelasque fornecem as chaves. 19. Visualizando em termos decdigo @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 operaes paraclasses associadas; Tipos: ALL Todas as operaes possveis so 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 persistncia cascateada para as classes associadas. REFRESH Se a entidade fonte for atualizada, a atualizao cascateada para as classes associadas. REMOVE Se a entidade fonte for removida, as classes associadas tambm sero removidas. Exemplo:@OneToMany(cascade={CascadeType.REMOVE})private List dependentes; 21. Carregando as Associaes A associaes podem ser carregadas de duas formas: EAGER A associao carregada juntamente com a classe base.@OneToMany(fetch=FetchType.EAGER) LAZY A associao somente carregada quando for usada. @OneToMany(fetch=FetchType.LAZY) Em associaes ManyToOne e OneToOne, EAGER padro. Em associaes OneToMany e ManyToMany, LAZY padro. As colees s so inicializadas quando houver necessidade; Apenas quando algum mtodo que acesse o contedo da coleo for executado que ela ser preenchida; 22. Prtica Atualize as classes anteriores conforme odiagrama abaixo: