parte ii persistênciaentre modelosde dadosclodis/pmd/pmd_intro181008.pdf · 2008-10-25 ·...

50
Persistência entre Modelos de Dados Clodis Boscarioli Parte II

Upload: duongtram

Post on 11-Nov-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Persistência entre

Modelos de Dados

Clodis Boscarioli

Parte II

Page 2: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Agenda:

� Hibernate – Introdução;

� Configurações;

� Mapeamento com XML;� Exemplos;

� Associações:� 1-n;

� n-1;

� n-n;

� 1-1.

Page 3: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Hibernate - Introdução

� O Hibernate (http://www.hibernate.org) é um framework para mapeamento objeto-relacional para a linguagem Java.

� Na prática, ele é um conjunto de classes, interfaces e arquivos de configuração pré-acabados que permitem a criação de uma camada de serviço capaz de abstrair a existência do banco de dados para sistemas Java.

Page 4: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Hibernate - Introdução

� Mais indicado para sistemas que contam com um modelo de objetos rico, onde a maior parte da lógica de negócios fica na própria aplicação Java, dependendo pouco de funções específicas do banco de dados.

� Sistemas que fazem uso extensivo de Stored Procedures, Triggers ou que implementam a maior parte da lógica da aplicação no banco de dados, contando com um modelo de objetos “pobre” não se beneficiam do uso do Hibernate.

Page 5: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Hibernate - Arquitetura

Page 6: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

� Interfaces responsáveis por executar operações de criação, deleção, consulta e atualização no banco de dados: Session, Transaction e Query;

� Interface utilizada pela aplicação para configurar o Hibernate: Configuration;

� Interfaces responsáveis por realizar a interação entre os eventos do Hibernate e a aplicação: Interceptor, Lifecycle e Validatable.

� Interfaces que permitem a extensão das funcionalidades de mapeamento do Hibernate: UserType, CompositeUserType, IdentifierGenerator.

� O Hibernate também interage com APIs já existentes do Java: JTA, JNDI e JDBC.

� De todas as interfaces apresentadas, as principais são: Session, SessionFactory, Transaction, Query, Configuration.

Hibernate - Arquitetura

Page 7: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

� Session (org.hibernate.Session)� O objeto Session é aquele que possibilita a comunicação entre a aplicação e a persistência, através de uma conexão JDBC. É um objeto leve de ser criado e não deve ter tempo de vida por toda a aplicação. Um objeto Session possui um cache local de objetos recuperados na sessão. Com ele é possível realizar operações CRUD (create, retrieve, update e delete).

� SessionFactory (org.hibernate.SessionFactory)� O objeto SessionFactory éaquele que mantém o mapeamento objeto relacional em memória. Permite a criação de objetos Session, a partir dos quais os dados são acessados, também denominado como fábrica de objetos Sessions. Um objeto SessionFactory é pesado e por isso deve existir apenas uma instância dele na aplicação (usar o pattern Singleton)

Hibernate - Arquitetura

Page 8: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

� Configuration (org..hibernate.Configuration)� Um objeto Configuration é utilizado para realizar as configurações de inicialização do Hibernate. Com ele, define-se diversas configurações do Hibernate, como: o driver do banco de dados a ser utilizado, o dialeto, o usuário e senha do banco, entre outras. É a partir de uma instância desse objeto que se indica como os mapeamentos entre classes e tabelas de banco de dados devem ser feitos.

� Transaction (org.hibernate.Transaction)� A interface Transaction é utilizada para representar uma unidade indivisível de uma operação de manipulação de dados. O uso dessa interface em aplicações que usam Hibernate é opcional. Essa interface abstrai a aplicação dos detalhes das transações JDBC, JTA (Java Transaction API) e outros mecanismos para gerenciamento de transações que podem vir a ser integrados ao Hibernate (ex: EJB, Spring).

� Interfaces Criteria e Query� As interfaces Criteria e Query são utilizadas para realizar consultas ao banco de dados

Hibernate - Arquitetura

Page 9: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Hibernate – Introdução

� Deve fazer o download de uma versão estável do Hibernate 3 (ou superior);

� Adicionar o arquivo hibernate3.jar e os arquivos da pasta “lib” do download ao classpath da aplicação (ou ao classpath da IDE);

� Adicionar o driver do SGBD;

Page 10: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Hibernate: Módulos� Hibernate Core

� Contém os serviços básicos;�Metadados escritos em XML;� Consultas

� HQL: Hibernate Query Language;� Interfaces utilizando critérios e exemplos;

� Não depende de outros módulos;� Não depende de uma versão específica do JDK;� Executável em qualquer servidor Web e/ou de Aplicaçãoe também em aplicações desktop;

Page 11: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Módulos

� Hibernate Annotations� Permite a escrita de metadados através de Annotations;� Beneficia-se da tipagem do Java;� Compatível com refatorações de código;� Semântica familiar para quem já está acostumado com metadados em XML;

� Utiliza as Annotations da especificação JPA;� Possui Annotations próprias para configuraçõesavançadas não presentes na especificação;

� Necessita do JDK 5.0;

Page 12: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Módulos

� Hibernate Entity Manager� Implementação da especificação JPA;� Permite a escrita de código compatível com qualquerframework de persistência que implemente a especificação;

� Utiliza o pacote javax.persistence;� Não disponibiliza todas as funcionalidades do Hibernate.

Page 13: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Hibernate – Utilização

� Três são os passos necessários para utilizar o Hibernate:

1. Criar os arquivos de mapeamento, que definem, em suma relações entre classes e tabelas e entre propriedades e colunas ou relacionamentos.

2. Definir o arquivo de configuração do serviço, que engloba informações como valores de conexão, usuário, senha, sintaxe do banco de dados e outros.

3. Criar a aplicação cliente que utiliza a API do Hibernate para persistir e recuperar objetos na base de dados.

Page 14: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

� O Hibernate não exige nenhuma regra sobre as classes a serem persistidas. Não é preciso estender nenhuma classe, nem implementar interfaces ou seguir padrões, porém, éfortemente recomendado seguir algumas diretrizes, que visam, objetivamente, aumentar o desempenho, a escalabilidade, a independência e a facilidade de uso de todo o sistema.

Hibernate – Utilização

Page 15: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

� As diretrizes são simples:

1. Seguir o modelo POJO (Plain Old Java Objects), que também é uma diretriz para a Java Persistence API;

2. Providenciar um atributo identificador para a classe;

3. Não declarar classes FINAL, uma vez que benefícios da instrumentação de código (como otimização de acesso) não vão estar disponíveis.

Hibernate – Utilização

Page 16: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Hibernate – Mapeamento

� Mapear objetos significa definir quais são as relações entre as classes e as tabelas e entre as propriedades e colunas ou relacionamentos. Isso pode ser feito via arquivos XML ou via anotações (Annotation).

� O mapeamento via arquivos XML é o tradicional, desde a versão 0.x do framework. O mapeamento via anotações está disponível para a versão 3+ do framework que opera sobre o Java 1.5.

� Escolher entre usar XML ou anotações é uma opção do desenvolvedor. Nota-se, porém, que as anotações exigem o download de outro arquivo do Hibernate, o Hibernate Annotations, que nada mais é do que um arquivo JAR a ser colocado no diretório de bibliotecas do sistema.

Page 17: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Configurando o Hibernate

� Configuração feita através do arquivohibernate.cfg.xml

� Deve estar localizado na raiz do classpath� Localização default

� Configurações contém:� Parâmetros de acesso a base de dados� Entidades a serem persistidas

Page 18: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Primeiro Exemplo

� Configurando Hibernate� Instanciar um objeto de configuração (org.hibernate.cfg.Configuration) e inserir suas propriedades;

� Usar um arquivo .properties com as suas configurações e indicar as classes mapeadas;

� Usar um arquivo XML (hibernate.cfg.xml) com as propriedades de inicialização e os caminhos das classes mapeadas.

Page 19: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

hibernate.cfg.xml - Estrutura Básica

<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory><mapping resource="Curso.hbm.xml"/><mapping resource="Disciplina.hbm.xml"/>

</session-factory>

</hibernate-configuration>

Page 20: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Hibernate – Configurações

� Hibernate tipicamente utiliza 1 arquivo de configuração geral (hibernate.cfg.xml) e arquivos de mapeamento para cada uma das classes de persistência (em arquivos do tipo *.hbm.xml ou através de anotações nas próprias classes)

� Os arquivos de mapeamentos XML entre classes e tabelas do banco de dados devem ser nomeados como *.hbm.xml(convenção definida pela comunidade de desenvolvedores do Hibernate). É nos arquivos com a extensão .hbm.xml que o Hibernate realiza o mapeamento objeto relacional.

Page 21: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

� Configurando o Hibernate� hibernate.dialect: implementação do dialeto SQL específico do banco de dados a ser utilizado. Usado

para identificar as particularidades do banco de dados;

� hibernate.connection.driver_class: nome da classe do driver JDBC do banco de dados que está sendo utilizado;

� hibernate.connection.url: é a URL de conexão específica do banco que está sendo utilizado;

� hibernate.connection.username: é o nome de usuário com o qual o Hibernate deve se conectar ao banco;

� hibernate.connection.password: é a senha do usuário com o qual o Hibernate deve se conectar ao banco;

� hibernate.connection.pool_size: tamanho do pool de conexões;

� Parâmetro opcional:

� hibernate.show_sql: utilizado para definir se os SQL’s gerados pelo Hibernate devem ou não ser exibidos (true | false).

Hibernate – Configurações

Page 22: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Hibernate – Chave-primária

� Mecanismos para Chave-Primária:

Page 23: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Exemplo:

Page 24: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

hibernate.properties

hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

hibernate.connection.driver_class = org.postgresql.Driver

hibernate.connection.url = jdbc:postgresql://localhost:5432/Aula

hibernate.connection.username = postgres

hibernate.connection.password = postgres

Page 25: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

log4j.properties

log4j.rootLogger=DEBUG, dest1

log4j.appender.dest1=org.apache.log4j.ConsoleAppender

log4j.appender.dest1.layout=org.apache.log4j.PatternLayout

log4j.appender.dest1.layout.ConversionPattern=%d %-5p %-5c{3} %x -> %m%n

Page 26: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Hibernate – Mapeamento viaArquivos XML

Page 27: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Curso.Javapackage modelo;

public class Curso {private int cod;private String nomecurso; public Curso() {}

public int getCod() {return cod;

}

public void setCod(int cod) {this.cod = cod;

}

public String getNomecurso() {return nomecurso;

}

public void setNomecurso(String nomecurso) {this.nomecurso = nomecurso;

}

}

Page 28: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Disciplina.Javapackage modelo;

public class Disciplina {private int cod;private String nomedisc;private String ch;private Curso curso;

public Disciplina () {}

public String getCh() {return ch;

}

public void setCh(String ch) {this.ch = ch;

}

public int getCod() {return cod;

}

public void setCod(int cod) {this.cod = cod;

}

public Curso getCurso() {return curso;

}

public void setCurso(Curso curso) {this.curso = curso;

}

public String getNomedisc() {return nomedisc;

}

public void setNomedisc(String nomedisc) {this.nomedisc = nomedisc;

}}

Page 29: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Curso.hbm.xml

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

<class name="modelo.Curso" table="curso"><id name="cod" type="integer" column="cod_curso" unsaved-value="0"><generator class="sequence"><param name="sequence">"Curso_cod_curso_seq"</param></generator>

</id><property name="nomecurso" column="nome" />

</class>

</hibernate-mapping>

Page 30: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Disciplina.htm.xml

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping><class name="modelo.Disciplina" table="disciplina"><id name="cod" column="cod_disc" unsaved-value="0"><generator class="sequence"><param

name="sequence">"disciplina_cod_disc_seq"</param></generator></id><property name="nomedisc" column="nome"/><property name="ch"/><many-to-one name="curso" class="modelo.Curso" column ="cod_curso"/>

</class></hibernate-mapping>

Page 31: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

DAO.Java

package dao;

import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;

public class DAO {

private SessionFactory sessionFactory;private Session session;

public DAO() {Configuration cfg = new Configuration();sessionFactory = cfg.configure().buildSessionFactory();

}

public void inserir(Object obj) {session = sessionFactory.openSession();session.beginTransaction();session.save(obj);session.getTransaction().commit();session.close();

}}

Page 32: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Main.Java

package javaapplication5;

import dao.DAO;import modelo.Curso;

/**** @author Boscarioli*/public class Main {

/*** @param args the command line arguments*/public static void main(String[] args) {

DAO dao = new DAO();Curso curso = new Curso();curso.setNomecurso("Serviço Social");

dao.inserir(curso);}

}

Page 33: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Mais sobre Hibernate...

<property name="cpf" type="long" column="CPF“ not-null="false"/>

� O atributo not-null presente no mapeamento do atributo cpf serve para informar se a coluna pode ser ou não nula na tabela. Se for true, não pode ser nula. Se for false, pode assumir valor nulo.

Page 34: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Mapeamento 1-n

� Ex: Na classe Universidade, criar:

private Collection centros;

� No hbm.xml de Universidade o mapeamento seráalgo como:

<set name="centros" inverse="true" lazy="true">

<key column="ID_UNIVERSIDADE"/>

<one-to-many class=“modelo.Centro"/>

</set>

Page 35: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Explicando...

� Na tag set também está presente o atributo lazy. Ele é utilizado para resolver o seguinte problema: quando se realiza um selectem um objeto Universidade implica em serem feitos n (número de centros da universidade) outros select’s para buscar os seus centros. Dessa forma, a resolução do problema é 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 centros de uma universidade só seria solicitada caso o programador a acesse através da chamada ao método getCentros().

Page 36: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

� A tag set também apresenta um atributo denominado 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.

� Considerando o relacionamento entre uma universidade e seus centros, no mapeamento do conjunto de centros em universidade, o atributo inverse é igual a true. Dessa forma, a criação ou atualização do relacionamento entre um centro e uma universidade será feita durante a persistência ou atualização de um objeto Centro.

Page 37: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Associações n-1

� Propriedades:

<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"

/>

� Para centros seria algo do tipo:

<many-to-one name="universidade“ class=“modelo.Universidade“cascade="none“ fech="join" update="true" insert="true" lazy="true“column="id_universidade"/>

Page 38: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

� 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;

� 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.

Propriedades da Associações n-1

Page 39: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

� 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.

Propriedades da Associações n-1

Page 40: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Associações n-n

� Exemplo, o hbm.xml de Departamento seria um que conteria algo do tipo:

<set name="cursos" table="DEPARTAMENTO_CURSO“inverse="true"> <key column="ID_DEPARTAMENTO"/> <many-to-many column="ID_CURSO“class=“modelo.Curso"/>

</set>

Page 41: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Exemplo:

� Para Curso seria:

...<set name="departamentos"

table="DEPARTAMENTO_CURSO"> <keycolumn="ID_CURSO"/>

<many-to-many column="ID_DEPARTAMENTO“class=“modelo.Departamento">

</set>

Page 42: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Explicando...

� Observa-se que tanto no mapeamento da coleção cursos em Departamento quanto no da coleção departamentos em Curso, o relacionamento n-n é feito a partir de uma tag set.

� Os mapeamentos das duas coleções apresentam uma tagkey, na qual o atributo column indica a chave estrangeira do pai na tabela de relacionamento DEPARTAMENTO_CURSO. Apresentam também a tag many-to-many utilizada para indicar a entidade filha e sua chave estrangeira no relacionamento.

Page 43: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

� A única diferença entre o mapeamento das duas coleções éque na tag set de cursos no mapeamento da entidade Departamento o atributo inverse é igual a true, significando que na tabela DEPARTAMENTO_CURSO só será inserido o relacionamento entre as duas entidades, quando um curso for inserido no banco de dados associado a um departamento.

� Neste caso, não seria necessário mapear a coleção de cursos em Departamento, pois não está sendo utilizada para popular a tabela de relacionamento.

Page 44: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Associações 1-1

� Há duas formas de se fazer. Exemplo hbm.xml para Universidade:

(1) <many-to-one name="endereco"

class=“modelo.Endereco“ column="ID_ENDERECO“cascade="save-update" unique="true"/>

� O atributo cascade foi definido como save-update, o que implica em o objeto Endereco ser inserido ou atualizado automaticamente quando o objeto Universidade for inserido ou atualizado. Nesse mapeamentoaparece a propriedade unique, que quando assume valor true implica em ter apenas uma universidade por endereço.

Page 45: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

� A 2ª estratégia consiste em Inserir o código abaixo no mapeamento de Universidade.hbm.xml. A tag <one-to-one> define o relacionamento 1-1 que a classe Universidade tem com a classe Endereco.

<one-to-one name="endereco“ class=“modelo.Endereco" cascade="save-update"/>

� Para utilizar a tag <one-to-one> no arquivo Universidade.hbm.xml, o mapeamento do endereço em Endereco.hbm.xml também deve ser feito, a exemplo do slide seguinte.

Associações 1-1

Page 46: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

<hibernate-mapping><class name=“modelo.Endereco" table="ENDERECO">

<id name="id" column="ID_UNIVERSIDADE" type="int"> <generator class="foreign">

<param name="property">universidade</param> </generator>

</id><property name="rua"/>

...<property name="cep"/>

<one-to-one name="universidade“ class=“modelo.Universidade“constrained="true"/>

</class></hibernate-mapping>

Page 47: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Explicando...

� A primeira diferença para o mapeamento anterior da entidade Endereco é o valor do atributo class da taggenerator agora é foreign.

� A tag param de name igual a property permite a associação 1-1 da classe Endereco com a classe Universidade (um parâmetro é passado para a classe geradora do identificador, que neste caso é a propriedade universidade, que é da classe que se relaciona 1-1 com Endereco).

� A garantia de que um endereço pertença a uma única universidade vem do fato da chave primária de Endereco(ID_UNIVERSIDADE) ser também a chave estrangeira que liga a Universidade.

Page 48: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

� O mapeamento 1-1 em Endereco de Universidade também é feito utilizando a tag <one-to-one>.

� Usar constrained igual a true implica em existir uma relação entre a chave-primária de Endereco e de Universidade, informando ao Hibernate que um endereço não pode existir sem que uma universidade exista.

Page 49: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Porque repetir a Associação?

� As linguagens OO representam as associações utilizando referências entre objetos; mas, no modelo relacional, uma associação é representada por uma coluna de chave estrangeira, com cópias dos valores da chave (e uma restrição para garantir a integridade).

� As referências entre objetos são essencialmente direcionais, a associação é de um objeto para o outro. Eles são ponteiros.

� Se uma associação entre os objetos deve ser bidirecional, esta terá que ser definida duas vezes, uma associação para cada uma das classes associadas.

Page 50: Parte II Persistênciaentre Modelosde Dadosclodis/PMD/PMD_Intro181008.pdf · 2008-10-25 · Hibernate-Introdução O Hibernate() ... HQL: Hibernate Query Language; ... éo nome de

Bibliografia Utilizada:

� Java Persistence com Hibernate. Christian Bauer, GavinKing. Editora Ciência Moderna, 2007.

� Artigos de revistas técnicas.

� Hibernate com XML. Raphaela Galhardo Fernandes, Gleydson de A. Ferreira Lima. Apostila, 2007.