23
Mapeamento OR com JPA Nelson Ion de Oliveira

07 - Mapeamento O-R Com JPA

Embed Size (px)

Citation preview

Page 1: 07 - Mapeamento O-R Com JPA

Mapeamento  O-­‐R  com  JPA  

Nelson  Ion  de  Oliveira  

Page 2: 07 - Mapeamento O-R Com JPA

•  Estratégias  de  geração  de  Chave  primária  •  Mapeamentos  Básicos  – @Table  – @Column  – @Lob  – @Temporal  – @Transient  – @Basic  – @Enumerated  

Page 3: 07 - Mapeamento O-R Com JPA

•  O   valor   de   chave   primária   pode   ser   definida  manualmente   ou   gerada   pelo   provedor   de  persistência.  

•  Tipos  possíveis:  – Qualquer  Mpo  primiMvo  Java  – Wrappers  de  Mpos  primiMvos  – Arrays  de  Mpos  primiMvos  e  Wrappers  –  Tipos  numéricos  grandes  –  Java.lang.String  –  Tipos  temporais  Java  – Uma  classe  de  chave  primária  composta  

Page 4: 07 - Mapeamento O-R Com JPA

•  Anotação  idenMfica  um  EnMty  no  banco  de  dados.  

•  Exemplo:  Chave  primária  

definida  manualmente.  

@En/ty  public  class  Aluno  implements  Serializable  {                      @Id              private  int  id;  }  

Page 5: 07 - Mapeamento O-R Com JPA

•  Uma  aplicação  pode  definir  uma  das  4  estratégias  de  geração  de  chaves  primárias.  – AUTO;  – TABLE  – SEQUENCE  – ou  IDENTITY  

•  Exemplo:  

O   provedor   de   persistência   uMliza   sua   própria   estratégia  (tabelas  ou  seqüência)  para  gerar  os  IDs.  Isto  requer  privilégios  que  freqüentemente  é  restrito  aos  DBAs.  

Estratégia  AUTO  

@En/ty  public  class  Aluno  implements  Serializable  {                      @Id  @GenerateValue(strategy=Genera/onType.AUTO)              private  int  id;  }  

Page 6: 07 - Mapeamento O-R Com JPA

•  Alguns  bancos  suportam  como  chave  primária  uma  coluna  de  auto-­‐incremento.  

•  Exemplo:  

•  Nesse  Mpo  de  estratégia,   na  maioria   dos   SGDBs,   não  é  possível   acessar   o  valor  do  ID  até  que  a  transação  seja  finalizada.  

•  Também  é  um  valor  automáMco,  assim  como  a  estratégia  AUTO.    

@En/ty  public  class  Aluno  implements  Serializable  {                      @Id  @GenerateValue(strategy=Genera/onType.IDENTITY)              private  int  id;  }  

Estratégia  IDENTITY  

Page 7: 07 - Mapeamento O-R Com JPA

•  Geração  uMlizando  TABLE....  •  Exemplo:  

O  provedor  assume  um  

tabela  default  

@En/ty  public  class  Aluno  implements  Serializable  {                      @Id  @GenerateValue(strategy=Genera/onType.TABLE)              private  int  id;  }  

Essa  estratégia  pode  ser  uMlizada  em  qualquer  Mpo  de  banco  de  dados.  Indica  que  o  provedor  de  persistência  deve  atribuir   as   chaves  primárias  para  a  enMdade  através  de  uma  tabela  de  banco  de  dados  subjacente  para  garanMr  a  exclusividade.  

Modelo  

Default  

Page 8: 07 - Mapeamento O-R Com JPA

•  Geração  uMlizando  TABLE....  •  Exemplo:  

@TableGenerator  pode  ser  anotado  em  atributos,  

classes  ou  métodos  

@En/ty    @TableGenerator(name=“Aluno_Gen”,  table=“ID_GEN”,  

         pkColumnName=“GEN_NAME”,            valueColumnName=“GEN_VAL”)  

public  class  Aluno  implements  Serializable  {        @Id  @GenerateValue(strategy=GeneraMonType.TABLE,      

                       generator=“Aluno_Gen”)              private  int  id;  }  

GEN_NAME   GEN_VAL  

Aluno_Gen   0  

ID_GEN  

Nomeada  

Page 9: 07 - Mapeamento O-R Com JPA

•  Geração  uMlizando  SEQUÊNCIA...  •  Exemplo:  

Este   Mpo   de   estratégia   depende   da   uMlização   de  seqüências  por  parte  do  SGBD.  

O  provedor  uMliza  uma  seqüência  default  

@En/ty  public  class  Aluno  implements  Serializable  {                      @Id  @GenerateValue(strategy=Genera/onType.SEQUENCE)              private  int  id;  }  

Modelo  

Default  

Page 10: 07 - Mapeamento O-R Com JPA

•  Geração  uMlizando  SEQUÊNCIA....  •  Exemplo:  

@En/ty  @SequenceGenerator(name=“Aluno_SeqGen”,    

                       sequenceName=“GEN_VAL”)  public  class  Aluno  implements  Serializable  {        @Id  @GenerateValue(strategy=GeneraMonType.SEQUENCE,  

                           generator=“Aluno_SeqGen”)              private  int  id;  }  

Nomeada  

Page 11: 07 - Mapeamento O-R Com JPA

•  Anotação  a  nível  de  classe  para  tratar  PrimaryKey  compostas.  

public  class  ClientePK  implements  Serializable  {                                private  String  sobreNome;                          private  Long  rg;                            public  ClientePK(){}                          .....                          //Gets  and  Sets.....                                                    public  boolean  equal(Object  o)  {...}                          public  int  hashCode()  {...}  }  

Classe  de  Chave  Primária  

@EnMty  @IdClass(ClientePK.class)  public  class  Cliente  implements  Serializable  {                                                          @Id  private  String  sobreNome;                          @Id  private  Long  rg;                                                        private  String  nome;                        //Gets  and  Sets  }  

Classe  da  En7dade  

Obrigatório  

Page 12: 07 - Mapeamento O-R Com JPA

•  Tratar  PK  composta  embu/ndo  a  classe  PK  dentro  da  enMdade.  

@Embeddable  public  class  ClientePK  implements  Serializable  {                                                        private  String  sobreNome;                        private  Long  rg;                            public  ClientePK(){}                          .....                          //Gets  and  Sets.....                                                    public  boolean  equal(Object  o)  {...}                          public  int  hashCode()  {...}  }  

Classe  de  Chave  Primária  

@EnMty  public  class  Cliente  implements  Serializable  {                                  private  String  nome;                        @EmbeddedId                          private  ClientePK  pk;                                                  //Gets  and  Sets  }  

Classe  da  En7dade  

Page 13: 07 - Mapeamento O-R Com JPA

•  Informa  ao  En7tyManager  a  tabela  relacional  para  qual  sua  classe  EnMty  é  mapeada.  

•  Exemplo:  

@En/ty  @Table(name=“TB_ALUNO”)  public  class  Aluno  implements  Serializable  {            //  código  da  enMdade  }  

Page 14: 07 - Mapeamento O-R Com JPA

•  Descreve  a  maneira  como  um  atributo  do  EnMty  é  mapeado  para  uma  coluna  da  tabela.  

•  Exemplo:  

@En/ty  public  class  Aluno  implements  Serializable  {                      @Column(name=“ALU_NOME”)              private  String  nome;            @Column(name=“ALU_SOBRENOME”)              private  String  sobreNome;  }  

Page 15: 07 - Mapeamento O-R Com JPA

•  Usado  para  mapear  propriedades  persistentes.  

•  UMlizado  quando  se  deseja  realizar  o  carregamento  sobre  demanda  (LAZY)  ou  imediatamente  (EAGER).  

•  Exemplo:   @EnMty  public  class  Cliente  implements  Serializable  {                                              @Basic(fetch=FetchType.LAZY)                          private  Byte[]  arquivo;  }  

Page 16: 07 - Mapeamento O-R Com JPA

•  UMlizado  quando  não  se  deseja  que  o  atributo  seja  persisMdo.    

@EnMty  public  class  Cliente  implements  Serializable  {                                  private  Date    dataNasc;                          @Transient                          private  int  idade;                                                  public  byte  getIdade(){  ....  }  }  

Page 17: 07 - Mapeamento O-R Com JPA

•  Permite  mapear  os  Mpos  de  objetos  (java.u7l.Date  e  java.u7l.Calendar)  para  DATE,  TIME  e  TIMESTAMP.  

@EnMty  public  class  Cliente  implements  Serializable  {                  private  long  Id;          @Temporal(TemporalType.TIME)            private  java.uMl.Date  MmeCreated;    

 //  GETs  and  SETs  }  

Page 18: 07 - Mapeamento O-R Com JPA

•  UMlizado  para  representar  propriedades  persistentes  que  exigem  muita  memória.  

•  Tipos  JDBC  especiais  –  Java.sql.Blob  –  Java.sql.Clob  

•  Anotações  com  @Lob  são  persisMdos  em  um:  –  Blob,  se  o  7po  java  for  byte[],  Byte[]  ou  Serializable;  –  Clob,  se  o  7po  java  for  char[],  Character[]  ou  String;  

Page 19: 07 - Mapeamento O-R Com JPA

•  Exemplo  

import    com.acme.imaging.JPEG  @EnMty  public  class  Cliente  implements  Serializable  {            @Id              private  long  Id;          private  String  name;            @Lob          @Basic(fetch=FetchType.LAZY)            private  JPEG  photo;    

 //  GETs  and  SETs  }  

Page 20: 07 - Mapeamento O-R Com JPA

•  Tipos  enum  Java  podem  ser  mapeados  para  a  representação  de  String  ou  Número  ordinal.  

•  Exemplo:     @EnMty  

public  class  Cliente  implements  Serializable  {            @Id              private  long  Id;          private  String  name;          @Enumerated(EnumType.STRING)          private  TypeClient  type;    

 //  GETs  and  SETs  }  

public  enum  TypeClient{                      REGISTRADO,                NAOREGISTRADO    }  

Page 21: 07 - Mapeamento O-R Com JPA
Page 22: 07 - Mapeamento O-R Com JPA

1.  Crie  uma  enMdade  simples  (Ex.:  Carro  [id,  placa,  Mpo]  e  aplique  a  esta  as  4  formas  de  geração  de  chave  primária.    Observe  a  forma  de  geração  para  o  SGBD  instalado  em  sua  máquina.  

2.  Crie  uma  enMdade  de  chave  primaria  composta  e  testes  a  duas  formas  possíveis,  em  JPA,  de  representá-­‐la.  

Page 23: 07 - Mapeamento O-R Com JPA

•  hpp://www.objectdb.com/java/jpa