Você está na página 1de 34

Programao de Componentes Distribudos

Thiago T I Yamamoto thiagoyama@gmail.com

Introduo ao Mapeamento Objeto Relacional

Componentes Avanados

Agenda
Conceitos de Mapeamento O/R Anotaes Java APIs de persistncia Entidades Mapeamento simples de entidades

Persistncia

String sql = INSERT INTO TAB_CLIENTE (ID, S_NM, N_SAL) VALUES (?, ?, ?); PreparedStatement ps = conn.prepareStatement(sql); ps.setInt(1, cliente.getCodigo()); ps.setString(2, cliente.getNome()); ps.setFloat(3, cliente.getSalario()); ...
3

Persistncia

Mapeamento: Cliente -> TAB_CLIENTE codigo -> ID nome -> S_NM salario -> N_SAL

Solues: XML ANOTAES JAVA

Anotaes Java
So textos inseridos diretamente no cdigo fonte que expressam informaes complementares sobre o uma classe, seus mtodos, propriedades, etc...; Tais informaes podem ser acessadas via API Reflection por elementos fora do cdigo fonte, por exemplo, APIs de persistncia; Disponveis no Java 5 (JSR-175); Permitem especificar metadados dentro do cdigo; Pode-se criar novas anotaes a qualquer momento sendo um processo bastante simples; Alternativa aos descritores de deployment (XML); No possvel alterar as anotaes caso no se tenha o cdigo fonte; Se utilizadas em excesso tendem a poluir o cdigo fonte.

Anotaes Java

Objetos so instanciados a partir de classes anotadas; Processador reconhece as anotaes encapsuladas nos objeto; Os resultados so produzidos a partir das informaes contidas nas anotaes.

Sintaxe das Anotaes


Podem ser inseridos antes da declarao de pacotes, classes, interfaces, mtodos ou propriedades; Iniciam com um @; Uma anotao tem efeito sobre o prximo elemento na seqncia de sua declarao; Mais de uma anotao pode ser aplicada a um mesmo elemento do cdigo (classe, mtodo, propriedade, etc...) Podem ter parmetros na forma (param1=valor, param2=valor, ...); Exemplo: @Override @SuppressWarnings("all") public String toString() { return "bla"; }
7

Anotaes Nativas
Algumas anotaes so nativas, isto , j vem com o JDK: @Override - Indica que o mtodo anotado sobrescreve um mtodo da superclasse; @Deprecated - Indica que um mtodo no deve mais ser utilizado; @SuppressWarnings (tipoAlerta) - desativa os alertas onde tipoAlerta pode ser all, cast , null, etc...;

Criando Anotaes
Semelhante a declarao de uma interface (no define implementao); Mtodos definem os parmetros aceitos pela anotao; Parmetros possuem tipos de dados restritos (String, Class, enumeration, annotation e arrays desses tipos); Parmetros podem ter valores default; Exemplo: public @interface Mensagem { String texto() default "vazio"; }

Acessando as Anotaes
Acesso em tempo de execuo via API Reflection; Para uma anotao de classe:
Mensagem m = obj.getClass().getAnnotation(Mensagem.class);

Para uma anotao de mtodo:


Method[] metodos = obj.getClass().getDeclaredMethods(); for (int i = 0; i < metodos.length; i++) System.out.println(metodos[i].getAnnotation(Mensagem.class));

Para uma anotao de propriedades:


Field[] att = obj.getClass().getDeclaredFields(); for (int i = 0; i < att.length; i++) System.out.println(att[i].getAnnotation(Mensagem.class));

10

Meta Anotaes
Anotaes para se criar anotaes: @Retention indica onde e por quanto tempo anotaes com este tipo sero mantidas: RetentionPolicy.SOURCE - Nvel cdigo fonte; RetentionPolicy.CLASS - Nvel compilador; RetentionPolicy.RUNTIME - Nvel JVM; @Target indica o escopo da anotao: ElementType.PACKAGE - Pacote; ElementType.TYPE - Classe ou Interface; ElementType.CONSTRUCTOR - Mtodo Construtor; ElementType.FIELD - Atributo; ElementType.METHOD - Mtodo; ElementType.PARAMETER - Parmetro de mtodo;

11

Exemplo
Criao da anotao: @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD}) public @interface Mensagem { String texto() default "vazio"; } Uso da anotao: @Mensagem(texto=Alo Classe) public class Teste { @Mensagem(texto=Alo Metodo) public void teste() { } }
12

Pratica!
Escreva uma classe que tenha um mtodo capaz de receber como parmetro um objeto e gerar cdigo SQL automaticamente capaz de selecionar todos os registro de uma tabela.

Criar uma anotao Table que possua um parmetro name indicando o nome da tabela na qual a classe ser mapeada.
Via API Reflection gerar automaticamente o cdigo SQL necessrio. Exemplo @Table (name=TAB_ALUNO) public class Aluno { } Ir gerar o SQL: SELECT * FROM TAB_ALUNO

13

APIs de Persistncia
Em um projeto de software real no necessrio que o desenvolvedor crie suas prprias anotaes para a persistncia de objetos;

Existem APIs j prontas que lidam com o problema, por exemplo, a especificao JPA;
Tais APIs so responsveis, entre outras coisas, pela transformao dos objeto em declaraes SQL (INSERT, UPDATE, DELETE, SELECT, ...).

14

JPA
Para evitar que cada API de persistncia defina seu prprio conjunto de anotaes uma especificao deve ser seguida; Este um dos objetivos da JPA Java Persistence API;

Assim, a JPA oferece um padro para mapeamento O/R por meio de anotaes Java e uma API de servios associados;
Exemplos de implementaes:

Hibernate
http://www.hibernate.org/ Toplink http://www.oracle.com/technetwork/middleware/toplink/overvie w/index.html; Dentro do ambiente EJB a JPA trata com a persistncia (Entity Beans) mas pode ser utilizada de modo isolado (fora de um EJB container).
15

JPA

16

Configurando o Ambiente
Voc encontra as bibliotecas do Hibernate / JPA no link: http://hibernate.org/orm/

17

Configurando o Ambiente

Pode-se utilizar a JPA tanto em um Java Project Quanto em um Dynamic Web Project

Na pasta META-INF fica o arquivo de configurao persistence.xml

necessrio o driver do banco de dados, ele tambm deve ser colocado no build path. Neste exemplo temos o driver do oracle

18

Entidades
Representam as unidades de persistncia; Correspondem a classes simples (POJO) cujo estado pode ser persistido;

Permitem o acesso aos dados por meio de mtodos get e set;


Possuem, obrigatoriamente, um identificador nico; Recomendvel que implementem a interface Serializable; Tais classes so mapeadas para o banco de dados por meio de anotaes; So como espelhos do banco de dados, isto , uma instncia criada ou alterada primeiramente em memria e posteriormente atualizada no banco de dados; So gerenciadas por um mecanismo de persistncia denominado Entity Manager;
19

@Entity
As anotaes da JPA situam-se no pacote javax.persistence; A anotao @Entity especifica que uma classe uma entidade; O nome da tabela da entidade ser o mesmo da classe com a anotao @Entity. Exemplo @Entity public class ClienteEntity { private int id; private String nome; // mtodos get e set }

20

@Table
Podemos alterar o nome da tabela assoociada a entidade atravs do atributo name da annotation @Table.

Exemplo
@Entity @Table(name=TAB_CLIENTE) public class ClienteEntity { @Id private int id; private String nome; // mtodos get e set }

21

@Id
Deve-se sempre definir o atributo que representar a chave primria; As nicas anotaes obrigatrias para uma entidade so o @Entity e @Id; As anotaes podem ser feitas tanto nas propriedades da classe quanto nos mtodos get; Exemplo

@Entity public class ClienteEntity { @Id private int id; private String nome; // mtodos get e set }
22

@GeneratedValue
Especifica a estratgia de gerao de valores automticos para propriedades; Normalmente utilizado em conjunto com o atributo anotado com @Id; Parmetros: generator: nome do gerador de chaves; strategy: indica o tipo de estratgia utilizada; Tipos mais comuns de estratgias de gerao: GeneratorType.SEQUENCE: baseado em sequence; GeneratorType.IDENTITY: campos identidade;

23

@SequenceGenerator
Define um gerador de chave primria baseado em sequence de banco de dados; Possui uma associao com o @GeneratedValue definido com a estratgia GenerationType.SEQUENCE; Parmetros: name: nome a ser referenciado pelo @GeneratedValue; sequenceName: nome da sequence de banco de dados; allocationSize : incremento

24

@SequenceGenerator
Exemplo
@Entity @SequeceGenerator(name="cliente", sequenceName="SEQ_CLIENTE",allocationSize=1) @Table(name=TAB_CLIENTE) public class ClienteEntity { @Id @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="cliente") @Column(name=COD_CLIENTE) private int id; @Column(name=NOM_CLIENTE, nullable=false) private String nome; // mtodos get e set }

25

@Column
Especifica o campo associada ao atributo da entidade; Caso no definido assume-se que o campo ter o mesmo nome do atributo; Alguns parmetros: Name - nome do campo; Nullable (default true) - no permite valores nulos; Insertable (default true) - atributo utilizado em operaes de INSERT; Updatable (default true) - atributo utilizado em operaes de UPDATE; Length (default 255) atributo utilizado para definnir o tamanho do campo, aplicado somente para strings

26

@Column
Exemplo @Entity @Table(name="TAB_CLIENTE") public class ClienteEntity { @Id @Column(name="COD_CLIENTE") private int id; @Column(name="NOM_CLIENTE", nullable=false) private String nome; // mtodos get e set }

27

@Transient
Indica que determinado atributo no deve ser persistido; Exemplo @Entity @Table(name="TAB_CLIENTE") public class ClienteEntity { @Id @Column(name="COD_CLIENTE") private int id; @Column(name="NOM_CLIENTE", nullable=false) private String nome; @Transient private int chaveAcesso; }
28

@Temporal
Especifica o tipo de dado a ser armazenado em propriedades do tipo Date e Calendar; Parmetros: value: TemporalType.TIMESTAMP: data e hora; TemporalType.DATE: somente data; TemporalType.TIME: somente hora; Exemplo
@Entity @Table(name=TAB_CLIENTE) public class ClienteEntity { ... @Column(name=DAT_NASCIMENTO) @Temporal(value=TemporalType.DATE) private Calendar dataNascimento; // ... Mtodos get / set }

29

@Lob
Permite mapear objetos de grande dimenso para a base de dados. Exemplo: imagens, documentos de texto, planilhas, etc... Os bancos de dados oferecem um tipo de dado para tais objetos. Exemplo: BLOB no Oracle; No objeto, o atributo mapeado normalmente do tipo byte[] (array); Exemplo
@Entity @Table(name=TAB_NOTICIA) public class NoticiaEntity { ... @Column(name="BLB_CONTEUDO") @Lob private byte[] conteudo; // ... Mtodos get / set }
30

Valores de Domnio (Enum)


Propriedades que possuem valores fixos, por exemplo, sexo (MASCULINO, FEMINIO), dia da semana (SEGUNDA, TERA, ...) Em Java podemos criar um Enum e utiliz-lo como tipo de dado do atributo de domnio; O ndice associado ao valor depende da seqncia que foi declarado no Enum; Exemplo public enum Tipo{ OURO, PRATA, BRONZE }

Exemplo acima, OURO= 0, PRATA =1 e BRONZE = 2

31

Valores de Domnio (Enum)


Exemplo @Entity @Table(name=TAB_CLIENTE) public class ClienteEntity { @Id @Column(name=COD_CLIENTE) private int id; @Column(name=IND_SEXO) private Sexo sexo; // ... Mtodos get / set }

32

Validaes
As validaes de campo (tamanho, etc...) podem tambm ser feitas dentro dos mtodos set; Caso alguma validao implique em falha uma exceo IllegalArgumentException pode ser lanada;

Exemplo
public void setNome(String nome) { if (nome.length() > 30) throw new IllegalArgumentException("Nome deve ter no mximo 30 caracteres"); this.nome = nome; }

33

Copyright 2013 Prof. Thiago T. I. Yamamoto

Todos direitos reservados. Reproduo ou divulgao total ou parcial deste documento expressamente proibida sem o consentimento formal, por escrito, do professor (autor).

34

Você também pode gostar