hibernate associacao

30
1 Hibernate Associação Caio Nakashima [email protected] [email protected]

Upload: vitor-magalhaes

Post on 04-Sep-2015

234 views

Category:

Documents


0 download

DESCRIPTION

Hibernate

TRANSCRIPT

  • *Hibernate AssociaoCaio [email protected]@gmail.com

  • *Classe pessoaimport 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; } // ... Mtodos get e set}

  • *Arquivo de mapeamento Person.hbm.xml

  • *Arquivo de mapeamento hibernateAdicionar novo mapeamento para a configurao do Hibernate (hibernate.cfg.xml)

  • *Associao entre duas entidadesSer criada associao entre duas entidades.Pessoas podem participar de eventos e eventos podem ter participantes.As questes de projeto para serem gerenciados so:Direo, multiplicidade e comportamento de coleo

  • *Uma associao unidirecionalSer adicionados eventos para a classe Pessoa.Por este caminho possvel navegar para os eventos para uma pessoa em particular, sem executar uma consulta explcita chamando o mtodo aPessoa.getEvents().Ser adicionado uma coleo de eventos para a classe Pessoa.Pode-se utilizar uma coleo Java (SET), porque a coleo no contem elementos duplicados e a ordem no relevante.Assim ser projetada uma associao unidirecional multi-valorado, implementado com um SET.

  • *Alterao da classe Pessoa.javapublic 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 pensarAntes de mapear esta associao, uma pequena reflexo.Esta uma associao unidirecional.Pode-se criar outra coleo na classe Event, se desejar navegar de forma bi-direcional, Event.getParticipants().Esta escolha de projeto fica a cargo do projetista, que claro nesta discusso de multiplicidade da associao, uma associao de muitos para muitos.

  • *Hibernate's many-to-many mapping:

  • *Tipos de MapeamentoHibernate suporta todos os tipos de mapeamento de colees, um o mais comum.Para uma associao de muitos-para-muitos (ou uma relaes entre entidades n:m), uma associao entre tabelas necessria.Cada linha desta tabela representa uma ligao 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 associao, para o lado da pessoa definido com o elemento , o nome da coluna para o lado do evento com o atriburo coluna de . necessrio informar o Hibernate a classe de objetos na coleo (a classe de outro lado da referncia).

  • *Mapeamento do Esquema

  • *Trabalhando com associao try{ sf = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory(); Session session = sf.openSession(); //Abre sesso Transaction tx = session.beginTransaction(); //Cria transao //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 transao session.close(); //Fecha sesso }Novo mtodo em Main.java para associar pessoas a eventos.

  • load() X get()http://forum.hibernate.org/viewtopic.php?p=2387456O mtodo load() mais antigo que o mtodo get().Se o mtodo load() no encontrar o objeto no cache ou banco de dados uma exceo gerada.O mtodo load() nunca retorna NULL. O mtodo get() retorna NULL se o objeto no for encontrado.Depois de carregar uma Pessoa (pessoa) e um Evento (event), adiciona-se o evento para a pessoa.No existe comando explcito de UPDATE() ou SAVE().

  • *automatic dirty checkingHibernate detecta automaticamente a coleo que foi modificado e a necessidade de ser salvo.Isto denominado automatic dirty checking, e pode-se observar isto tambm tentando modificar o nome e data de qualquer objeto.Como os dados esto em estado de persistncia, Hibernate monitora qualquer mudana e executa SQL em background.O processo de sincronizao do estado da memria com o banco de dados, termina com a finalizao da unidade de trabalho. Este processo denominado FLUSHING.

  • *PersistnciaPode-se carregar um pessoa ou evento para uma diferente unidade de trabalho.Pode-se modificar um objeto fora de uma seo, quando no est em estado de persistncia (se tiver sido persistido antes da seo ser chamada).

  • *AssociaoO exemplo apresentado foi de uma associao entre duas classes com mesmo grau de importncia, 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 instncias dependem de uma entidade em particular.As instncias destes tipos no possuem sua prpria entidade, nem so divididos entre entidades. Os tipos de valores no podem ser encontrado somente no JDK, mas podem tambm ser escritos dependentes da classe, Endereo ou Saldo, etc.Hibernate considera todos os tipos do JDK como tipo de valores.

  • *Coleo de valoresAdiciona-se uma coleo de tipos de valores para uma entidade Pessoa.Deseja-se armazenar endereo de email, assim o tipo utilizado String e a coleo novamente um Set.private Set email = new HashSet();public Set getEmail () { return email;}public void setEmail (Set email) { this.email = email;}
  • *A diferena comparando com o mapeamento anterior um elemento a parte, que especifica o Hibernate que a coleo no contm referncia a outra entidade, mas uma coleo de elementos do tipo String (o nome em letras minsculas especifica um mapeamento Hibernate tipo/converso).Novamente, o atributo de um conjunto de elementos do nome da tabela para a coleo.O elemento define a coluna de chave estrangeira da tabela de coleo.A coluna define o nome da coluna onde os valores String esto armazenados.

  • *Esquema com a tabela EMAIL

  • *A chave primria da tabela composta pelos valores das duas colunas (pess_id, email).Isto implica que no pode ser duplicado email por pessoa, que exatamente a semntica necessria para um conjunto em Java.Exerccio:Inserir elementos nesta coleo.Tentar repetir email para a mesma pessoa.

  • *Associao Bi direcionalO exemplo de associao bi-direcional ser entre pessoa (Pessoa) e trabalho no evento.O esquema do banco de dados no muda, ainda existir a multiplicidade de muitos-para-muitos.Um banco de dados mais flexvel que uma linguagem de programao distribudaNo necessita nada como uma direo de navegaoDados podem ser visualizados e recuperados em qualquer caminho possvel.

  • *Coleo de participantes do eventoprivate Set participants = new HashSet();

    public Set getParticipants() { return participants;}public void setParticipants(Set participants) { this.participants = participants;}

    Coleo de participantes do evento

  • *inverseEsse atributo utilizado para que o Hibernate saiba como tratar a associao entre duas tabelas. Quando um lado da associao define o atributo inverse como true, indica que a ligao do relacionamento entre a associao ser de responsabilidade do "outro lado" da associao.Se o atributo inverse no for definido como true, o Hibernate no tem como saber qual dos dois lados foi atualizado, ou seja, vai sempre atualizar os dois lados de uma vez, uma atualizao para cada classe da relao, o que seria desnecessrio. Caso contrrio, o Hibernate passa a saber de qual lado fazer a atualizao e fazendo uma nica vez.

  • *lazyConsiderando 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 resoluo do problema pode ser feita apenas definindo o atributo lazy como sendo true. A coleo de centros passa a ser lazy-loading, o que significa que somente ser recuperada quando solicitada, ou seja, a coleo de emails de uma Pessoa s seria solicitada caso o programador a acesse atravs da chamada ao mtodo getEmail().

  • *Mapeamento n-1
  • *Atributos do mapeamento n-1name: 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 includo e alterado ou somente lido;fetch: se definido como join usado para realizar joins sem restrio de nulidade (outer-join). Se for select, um novo select feito para recuperar a informao da associao.lazy: se igual a true, o objeto s ser recuperado se solicitado; se igual a false, o objeto sempre ser recuperado.

  • *cascadeindica com que ao em cascata o relacionamento ser tratadonone: associao ignorada;save-update:os objetos associados vo ser inseridos ou atualizados automaticamente quando o objeto "pai" for inserido ou atualizado;delete: os objetos associados ao objeto "pai" vo ser deletados;all: juno de delete e save-update;all-delete-orphan: o mesmo que all, mas o Hibernate deleta qualquer objeto que tiver sido retirado da associao;delete-orphan: se o objeto no fizer mais parte da associao, ele removido.

  • *fetch: se definido como join usado para realizar joins sem restrio de nulidade (outer-join). Se for select, um novo select feito para recuperar a informao da associao.lazy: se igual a true, o objeto s ser recuperado se solicitado; se igual a false, o objeto sempre ser recuperado.

  • *ExerccioConsiderando do Diagrama da prxima transparncia e utilizando a camada de persistncia Hibernate elaborar um conjunto de arquivos necessrios para criar as tabelas, inserir, alterar, excluir e listar os registros das seguintes entidades:

  • *Exerccionnnn11nnn1

    *****************************