Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com Hibernate Associação Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.

Slides:



Advertisements
Apresentações semelhantes
Exemplo de Projeto Vamos criar agora um projeto exemplo para verificar as condições de crédito de um conjunto de indivíduos; Nosso primeiro conjunto de.
Advertisements

Java Avançado Luiz Carlos d´Oleron SJCP Hibernate II.
Programação em Java Prof. Maurício Braga
Projeto – Parte II - Exemplos de Diagrama de Colaboração
Software Básico Silvio Fernandes
Collections Marco Antonio, Arquiteto de Software – TJDF Atualizado Dezembro/2008.
Prof. Alessandro J. de Souza
Java Conexão com Banco de Dados
Maurício Edgar Stivanello
Orientação a Objetos: Encapsulamento e Classificação
Java: Pacotes e Modificadores de Visibilidade
Sistema Gerenciador de Banco de Dados SGBD
Orientação a Objetos: Encapsulamento e Classificação
Persistência de objetos em arquivo texto usando Java
De 17 1 Linguagens de Programação Orientadas a Objetos Pós-Gradução(Lato-Sensu) em Sistemas de Banco de Dados - UFPa Marco Fagundes Aula.
1 MODELAGEM COM A UML (UNIFIED MODELING LANGUAGE) BREVE HISTÓRICO CARACTERÍSTICAS CONCEITOS DE PROGRAMAÇÃO ORIENTADA A OBJETOS MODELAGEM DE ANÁLISE E DE.
DNS Introdução.
Membros estáticos.
Hibernate Apresentação
1 Hibernate Introdução Caio Nakashima
EJB Regras de Convivência
Hibernate Apresentação
Documentando con Javadoc
Bancos de Dados – SQL – parte 1
Capítulo 9 Herança 1.
Mapeamento Objeto-Relacional Eduardo Martins Guerra Instituto Tecnológico de Aeronáutica Curso de Pós-Graduação em Engenharia de Software Programação Distribuída.
Classes e objetos Arrays e Sobrecarga
Classes e objetos Modelagem
Classes e objetos P. O. O. Prof. Grace.
Introdução a Programação JAVA
Hibernate com JPA Prática
Programação Orientada a Objetos com Java
Capítulo 2 Java Servlets.
JAVA Orientação a Objetos
Hibernate Mapeamento O/R.
METODOLOGIA PARA DESENVOLVIMENTO DE SISTEMAS Prof. Dr. rer. nat. Daniel D. Abdala 1.
Vânia Maria Ponte Vidal
Mapeamento de Objetos para o Modelo Relacional - Introdução
Hibernate: Consultas Francisco do Nascimento
Atributos, Encapsulamento e Interface em Java
Programação I Aula 2 (Métodos)
Entendendo as definições de classe
Linguagem de Programação JAVA
Introdução ao Hibernate
Introdução e Busca Cega
Hibernate Java avançado – PCC Jobson Ronan
Hibernate Java avançado – PCC Jobson Ronan
Os métodos equals() e hashCode()
Capítulo 5 Garbage Collector.
1-1 Copyright © Oracle Corporation, All rights reserved. Administrando Objetos de Esquema Este capítulo abordará os seguintes tópicos: Visão geral.
Banco de Dados Parte 04 Ceça. Ceça Moraes 2 Conteúdo  Os três níveis da arquitetura  Mapeamentos  Arquitetura cliente-servidor.
Stream – Fluxo I/O Sistema de Arquivos
Laboratório I Mateus Raeder. Mateus Raeder – fevereiro de 2009 Associação entre classes  Um objeto é a representação de uma entidade do mundo real 
Listas Simplesmente Encadeadas
Wagner Santos C. de Jesus
Configuração do Ambiente de programação
PostGres: Um Banco de Dados Orientado a Objetos
Banco de Dados Aplicado ao Desenvolvimento de Software
Laboratório de Programação II Método Construtor Dados e Métodos de Objetos Prof Edivaldo - Network.
Aula Prática 4 Monitoria IP/CC (~if669).
Coleções, Genéricos, Threads Marco Antonio. Collection Principais métodos da interface Collection.
Classes Abstratas e Interface
Programação I Aula 4 (Expressões Booleanas e Expressões de Seleção) Prof. Gilberto Irajá Müller Última atualização 17/3/2009.
Coleções em Java - Parte 2
Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor. Variáveis e métodos estáticos, Passagem de.
Componentes Avançados JPA - API Prof. Leandro Rubim
Bruno Inojosa MCP .NET Framework
Hibernate: Relacionamentos e Herança
Leo Silva Leonardo Murta Luiz Viana Persistência em Java.
Desenvolvimento WEB II Professora: Kelly de Paula Cunha.
Transcrição da apresentação:

Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com Hibernate Associação Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com

Classe pessoa import java.util.Calendar; public class Pessoa { private Long id; private Calendar dataNascimento; private String nome; private char sexo; /** Creates a new instance of Pessoa */ public Pessoa() {} public Long getId() { return id; } private void setId(Long pId) { this.id = pId; } public Calendar getDataNascimento() { return dataNascimento; } public void setDataNascimento (Calendar pData){ this.dataNascimento = pData; } // ... Métodos get e set }

Arquivo de mapeamento Person.hbm.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="Pessoa" table="PESSOA"> <id name="id" column="PES_ID"> <generator class="sequence"/> </id> <property name="dataNascimento" column="PES_DATANASC"/> <property name="nome" column="PES_NOME" not-null="true"/> <property name="sexo" column="PES_SEXO"/> </class> </hibernate-mapping>

Arquivo de mapeamento hibernate Adicionar novo mapeamento para a configuração do Hibernate (hibernate.cfg.xml) <mapping resource="Event.hbm.xml"/> <mapping resource="Pessoa.hbm.xml"/>

Associação entre duas entidades Será criada associação entre duas entidades. Pessoas podem participar de eventos e eventos podem ter participantes. As questões de projeto para serem gerenciados são: Direção, multiplicidade e comportamento de coleção

Uma associação unidirecional Será adicionados eventos para a classe Pessoa. Por este caminho é possível navegar para os eventos para uma pessoa em particular, sem executar uma consulta explícita chamando o método aPessoa.getEvents(). Será adicionado uma coleção de eventos para a classe Pessoa. Pode-se utilizar uma coleção Java (SET), porque a coleção não contem elementos duplicados e a ordem não é relevante. Assim será projetada uma associação unidirecional multi-valorado, implementado com um SET.

Alteração da classe Pessoa.java public class Pessoa { // Associando a um conjunto de eventos. private Set events = new HashSet(); public Set getEvents() { return events; } public void setEvents(Set events) { this.events = events;

Para pensar Antes de mapear esta associação, uma pequena reflexão. Esta é uma associação unidirecional. Pode-se criar outra coleção na classe Event, se desejar navegar de forma bi-direcional, Event.getParticipants(). Esta escolha de projeto fica a cargo do projetista, que é claro nesta discussão de multiplicidade da associação, uma associação de muitos para muitos.

Hibernate's many-to-many mapping: <hibernate-mapping> <class name="Pessoa" table="PESSOA"> <id name="id" column="PES_ID"> <generator class="sequence"/> </id> <property name="dataNascimento" column="PES_DATANASC"/> <property name="nome" column="PES_NOME" not-null="true"/> <property name="sexo" column="PES_SEXO"/> <set name="events" table="PESSOA_EVENT"> <key column="PES_ID"/> <many-to-many column="EVENT_ID" class="Event"/> </set> </class> </hibernate-mapping>

Tipos de Mapeamento Hibernate suporta todos os tipos de mapeamento de coleções, um <set> é o mais comum. Para uma associação de muitos-para-muitos (ou uma relações entre entidades n:m), uma associação entre tabelas é necessária. Cada linha desta tabela representa uma ligação entre uma pessoa e um evento. O nome da tabela é configurado com o atributo da tabela de um conjunto de elementos. O identificador no nome da coluna em uma associação, para o lado da pessoa é definido com o elemento <key>, o nome da coluna para o lado do evento com o atriburo coluna de <many-to-many>. É necessário informar o Hibernate a classe de objetos na coleção (a classe de outro lado da referência).

Mapeamento do Esquema Pessoa Events Pessoa-Event event_id (PK) event_date title Pessoa-Event event_id pes_id Pessoa nome sexo datanasc

Trabalhando com associação Novo método em Main.java para associar pessoas a eventos. try{ sf = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory(); Session session = sf.openSession(); //Abre sessão Transaction tx = session.beginTransaction(); //Cria transação //Busca uma pessoa Long pes_id = new Long(2); Pessoa pessoa = (Pessoa) session.get(Pessoa.class, pes_id); System.out.println("Pessoa "+pessoa.getNome()); //Busca uma evento Long event_id = new Long(1); Event evento = (Event) session.load(Event.class, event_id); System.out.println("Evento "+evento.getTitle()); pessoa.getEvents().add(evento); tx.commit(); //Fecha transação session.close(); //Fecha sessão }

load() X get() http://forum.hibernate.org/viewtopic.php?p=2387456 O método load() é mais antigo que o método get(). Se o método load() não encontrar o objeto no cache ou banco de dados uma exceção é gerada. O método load() nunca retorna NULL. O método get() retorna NULL se o objeto não for encontrado. Depois de carregar uma Pessoa (pessoa) e um Evento (event), adiciona-se o evento para a pessoa. Não existe comando explícito de UPDATE() ou SAVE().

automatic dirty checking Hibernate detecta automaticamente a coleção que foi modificado e a necessidade de ser salvo. Isto é denominado automatic dirty checking, e pode-se observar isto também tentando modificar o nome e data de qualquer objeto. Como os dados estão em estado de persistência, Hibernate monitora qualquer mudança e executa SQL em background. O processo de sincronização do estado da memória com o banco de dados, termina com a finalização da unidade de trabalho. Este processo é denominado FLUSHING.

Persistência Pode-se carregar um pessoa ou evento para uma diferente unidade de trabalho. Pode-se modificar um objeto fora de uma seção, quando não está em estado de persistência (se tiver sido persistido antes da seção ser chamada).

Associação O exemplo apresentado foi de uma associação entre duas classes com mesmo grau de importância, duas entidades. Existem outras classes e tipos que podem ser classificados como “menos importantes”. Denomina-se estas classes do tipo valores (value types) e suas instâncias dependem de uma entidade em particular. As instâncias destes tipos não possuem sua própria entidade, nem são divididos entre entidades. Os tipos de valores não podem ser encontrado somente no JDK, mas podem também ser escritos dependentes da classe, Endereço ou Saldo, etc. Hibernate considera todos os tipos do JDK como tipo de valores.

Coleção de valores Adiciona-se uma coleção de tipos de valores para uma entidade Pessoa. Deseja-se armazenar endereço de email, assim o tipo utilizado é String e a coleção é novamente um Set. private Set email = new HashSet(); public Set getEmail () { return email; } public void setEmail (Set email) { this.email = email; Mapeamento <set name="email" table=“PESSOA_EMAIL"> <key column="PES_ID"/> <element type="string" column="EMAIL"/> </set>

A diferença comparando com o mapeamento anterior é um elemento a parte, que especifica o Hibernate que a coleção não contém referência a outra entidade, mas uma coleção de elementos do tipo String (o nome em letras minúsculas especifica um mapeamento Hibernate tipo/conversão). Novamente, o atributo <table> de um conjunto de elementos do nome da tabela para a coleção. O elemento <key> define a coluna de chave estrangeira da tabela de coleção. A coluna <attribute> define o nome da coluna onde os valores String estão armazenados.

Esquema com a tabela EMAIL Events event_id (PK) event_date title Pessoa-evento event_id pess_id Pessoa pes_id nome datanasc sexo Pessoa_email pess_id email

A chave primária da tabela é composta pelos valores das duas colunas (pess_id, email). Isto implica que não pode ser duplicado email por pessoa, que é exatamente a semântica necessária para um conjunto em Java. Exercício: Inserir elementos nesta coleção. Tentar repetir email para a mesma pessoa.

Associação Bi direcional O exemplo de associação bi-direcional será entre pessoa (Pessoa) e trabalho no evento. O esquema do banco de dados não muda, ainda existirá a multiplicidade de muitos-para-muitos. Um banco de dados é mais flexível que uma linguagem de programação distribuída Não necessita nada como uma direção de navegação Dados podem ser visualizados e recuperados em qualquer caminho possível.

Coleção de participantes do evento private Set participants = new HashSet(); public Set getParticipants() { return participants; } public void setParticipants(Set participants) { this.participants = participants; Coleção de participantes do evento <set name="participants" table="PESSOA_EVENT" lazy="true" inverse="false"> <key column="EVENT_ID"/> <many-to-many column="PERSON_ID" class="Person"/> </set>

inverse Esse atributo é utilizado para que o Hibernate saiba como tratar a associação entre duas tabelas. Quando um lado da associação define o atributo inverse como true, indica que a ligação do relacionamento entre a associação será de responsabilidade do "outro lado" da associação. Se o atributo inverse não for definido como true, o Hibernate não tem como saber qual dos dois lados foi atualizado, ou seja, vai sempre atualizar os dois lados de uma vez, uma atualização para cada classe da relação, o que seria desnecessário. Caso contrário, o Hibernate passa a saber de qual lado fazer a atualização e fazendo uma única vez.

lazy Considerando o problema: quando se realiza uma consulta (select) em um objeto Pessoa implica em serem feitos n (quantidade de emails da Pessoa) outras consultas para buscar os seus emails. A resolução do problema pode ser feita apenas definindo o atributo lazy como sendo true. A coleção de centros passa a ser lazy-loading, o que significa que somente será recuperada quando solicitada, ou seja, a coleção de emails de uma Pessoa só seria solicitada caso o programador a acesse através da chamada ao método getEmail().

Mapeamento n-1 <many-to-one name="propertyName" class="ClassName" column="column_name" fetch="join|select" update="true|false" lazy="true|false" insert="true|false" cascade="all|none|save- update|delete“ />

Atributos do mapeamento n-1 name: nome do atributo na classe Java; column: coluna do banco de dados. É uma chave estrangeira; class: nome da classe Java da entidade relacionada; insert e update: indica se o atributo será incluído e alterado ou somente lido; fetch: se definido como join é usado para realizar joins sem restrição de nulidade (outer-join). Se for select, um novo select é feito para recuperar a informação da associação. lazy: se igual a true, o objeto só será recuperado se solicitado; se igual a false, o objeto sempre será recuperado.

cascade indica com que ação em cascata o relacionamento será tratado none: associação é ignorada; save-update:os objetos associados vão ser inseridos ou atualizados automaticamente quando o objeto "pai" for inserido ou atualizado; delete: os objetos associados ao objeto "pai" vão ser deletados; all: junção de delete e save-update; all-delete-orphan: o mesmo que all, mas o Hibernate deleta qualquer objeto que tiver sido retirado da associação; delete-orphan: se o objeto não fizer mais parte da associação, ele removido.

fetch: se definido como join é usado para realizar joins sem restrição de nulidade (outer-join). Se for select, um novo select é feito para recuperar a informação da associação. lazy: se igual a true, o objeto só será recuperado se solicitado; se igual a false, o objeto sempre será recuperado.

Exercício Considerando do Diagrama da próxima transparência e utilizando a camada de persistência Hibernate elaborar um conjunto de arquivos necessários para criar as tabelas, inserir, alterar, excluir e listar os registros das seguintes entidades: + pessoas Sim Palestras Pessoa_telefones Pessoa_email + email + tel Pessoas Event Listar Alter. Excl. Inser. Criar Entidade

Exercício Events event_id (PK) event_date title Pessoa pes_id nome datanasc sexo n n 1 n n Palestra palestra_id tema titulo 1 1 n n n Pessoa_telefones pess_id telefone Tipo (celular, Residencial, etc.) Pessoa_email pess_id email