[RESOLVIDO]Como persistir dados de classes que usam o relacionamento ManyToMany

11 respostas
J

Olá!
Estou desenvolvendo uma aplicação Desktop de controle de biblioteca.
Utilizo NetBeans 7.0 + SQL Server 2008 + Hibernate.

Estou em dúvida de como se faz um cadastro de uma classe que tem herança de outra usando uma relação de muitos pra muitos, que no caso aqui é de ItemBiblioteca tem Muitos autores e um autor está em varios itens.
Para ficar mais claro, vou mostrar os códigos da super classe e de uma subclasse.

Classe ItemBiblioteca (é a super classe):

package br.com.Dominio;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.xml.bind.annotation.XmlTransient;

@Entity
@Table(name = "ItemBiblioteca", catalog = "ControleBibliotecario", schema = "dbo")
@Inheritance(strategy= InheritanceType.JOINED)

public class ItemBiblioteca implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    @Basic(optional = false)
    @Column(name = "CodItemBiblioteca", nullable = false)
    private Integer codItemBiblioteca;
    @Basic(optional = false)
    @Column(name = "TxTitulo", nullable = false, length = 100)
    private String txTitulo;
    @Basic(optional = false)
    @Column(name = "NuReferencia", nullable = false)
    private int nuReferencia;
    @Basic(optional = false)
    @Column(name = "NuEdicao", nullable = false)
    private int nuEdicao;
    @Basic(optional = false)
    @Column(name = "NuAnoEdicao", nullable = false)
    private int nuAnoEdicao;
    @Basic(optional = false)
    @Column(name = "NuExemplar", nullable = false)
    private int nuExemplar;
    @Column(name = "TxObservacao", length = 100)
    private String txObservacao;
    @Basic(optional = false)
    @Column(name = "DaCadastro", nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date daCadastro;
  
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "itemBiblioteca")
    private Collection<ItemBibliotecaAutor> itemBibliotecaAutorCollection;
    
    @OneToMany(mappedBy = "codItemBiblioteca")
    private Collection<Exemplar> exemplarCollection;
    
    @JoinColumn(name = "CodSecao", referencedColumnName = "CodSecao")
    @ManyToOne
    private Secao codSecao;
    
    @JoinColumn(name = "CodEditora", referencedColumnName = "CodEditora")
    @ManyToOne
    private Editora codEditora;
    
    public ItemBiblioteca() {
    }

    public ItemBiblioteca(Integer codItemBiblioteca) {
        this.codItemBiblioteca = codItemBiblioteca;
    }

    public ItemBiblioteca(Integer codItemBiblioteca, String txTitulo, int nuReferencia, int nuEdicao, int nuAnoEdicao, int nuExemplar, Date daCadastro) {
        this.codItemBiblioteca = codItemBiblioteca;
        this.txTitulo = txTitulo;
        this.nuReferencia = nuReferencia;
        this.nuEdicao = nuEdicao;
        this.nuAnoEdicao = nuAnoEdicao;
        this.nuExemplar = nuExemplar;
        this.daCadastro = daCadastro;
    }

    public Integer getCodItemBiblioteca() {
        return codItemBiblioteca;
    }

    public void setCodItemBiblioteca(Integer codItemBiblioteca) {
        this.codItemBiblioteca = codItemBiblioteca;
    }

    public String getTxTitulo() {
        return txTitulo;
    }

    public void setTxTitulo(String txTitulo) {
        this.txTitulo = txTitulo;
    }

    public int getNuReferencia() {
        return nuReferencia;
    }

    public void setNuReferencia(int nuReferencia) {
        this.nuReferencia = nuReferencia;
    }

    public int getNuEdicao() {
        return nuEdicao;
    }

    public void setNuEdicao(int nuEdicao) {
        this.nuEdicao = nuEdicao;
    }

    public int getNuAnoEdicao() {
        return nuAnoEdicao;
    }

    public void setNuAnoEdicao(int nuAnoEdicao) {
        this.nuAnoEdicao = nuAnoEdicao;
    }

    public int getNuExemplar() {
        return nuExemplar;
    }

    public void setNuExemplar(int nuExemplar) {
        this.nuExemplar = nuExemplar;
    }

    public String getTxObservacao() {
        return txObservacao;
    }

    public void setTxObservacao(String txObservacao) {
        this.txObservacao = txObservacao;
    }

    public Date getDaCadastro() {
        return daCadastro;
    }

    public void setDaCadastro(Date daCadastro) {
        this.daCadastro = daCadastro;
    }

    @XmlTransient
    public Collection<ItemBibliotecaAutor> getItemBibliotecaAutorCollection() {
        return itemBibliotecaAutorCollection;
    }

    public void setItemBibliotecaAutorCollection(Collection<ItemBibliotecaAutor> itemBibliotecaAutorCollection) {
        this.itemBibliotecaAutorCollection = itemBibliotecaAutorCollection;
    }

    @XmlTransient
    public Collection<Exemplar> getExemplarCollection() {
        return exemplarCollection;
    }

    public void setExemplarCollection(Collection<Exemplar> exemplarCollection) {
        this.exemplarCollection = exemplarCollection;
    }

    public Secao getCodSecao() {
        return codSecao;
    }

    public void setCodSecao(Secao codSecao) {
        this.codSecao = codSecao;
    }

    public Editora getCodEditora() {
        return codEditora;
    }

    public void setCodEditora(Editora codEditora) {
        this.codEditora = codEditora;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (codItemBiblioteca != null ? codItemBiblioteca.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof ItemBiblioteca)) {
            return false;
        }
        ItemBiblioteca other = (ItemBiblioteca) object;
        if ((this.codItemBiblioteca == null && other.codItemBiblioteca != null) || (this.codItemBiblioteca != null && !this.codItemBiblioteca.equals(other.codItemBiblioteca))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.com.Dominio.ItemBiblioteca[ codItemBiblioteca=" + codItemBiblioteca + " ]";
    }
    
}

E a subclasse CDDVD:

package br.com.Dominio;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@PrimaryKeyJoinColumn(name="CodItemBiblioteca")
@Table(name = "CDDVD", catalog = "ControleBibliotecario", schema = "dbo")

public class Cddvd extends ItemBiblioteca implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Column(name = "TxConteudo", nullable = false, length = 20)
    private String txConteudo;
    @Column(name = "NuDuracao")
    @Temporal(TemporalType.TIME)
    private Date nuDuracao;
    
    @JoinColumn(name = "CodTipoCDDVD", referencedColumnName = "CodTipoCDDVD")
    @ManyToOne
    private TipoCDDVD codTipoCDDVD;
    
    public Cddvd() {
    }

    public Cddvd(String txConteudo) {
        this.txConteudo = txConteudo;
    }

    public String getTxConteudo() {
        return txConteudo;
    }

    public void setTxConteudo(String txConteudo) {
        this.txConteudo = txConteudo;
    }

    public Date getNuDuracao() {
        return nuDuracao;
    }

    public void setNuDuracao(Date nuDuracao) {
        this.nuDuracao = nuDuracao;
    }

    public TipoCDDVD getCodTipoCDDVD() {
        return codTipoCDDVD;
    }

    public void setCodTipoCDDVD(TipoCDDVD codTipoCDDVD) {
        this.codTipoCDDVD = codTipoCDDVD;
    }

    @Override
    public String toString() {
        return "br.com.Dominio.Cddvd[ codItemBiblioteca=" + getCodItemBiblioteca() + " ]";
    }
    
}

Utilizo o seguinte código de teste:

package br.com.Testes;


import br.com.Dominio.Autor;
import br.com.Dominio.Cddvd;
import br.com.Dominio.Editora;
import br.com.Dominio.ItemBibliotecaAutor;
import br.com.Dominio.Secao;
import br.com.Dominio.TipoCDDVD;
import br.com.Persistencia.CddvdDAO;
import br.com.Persistencia.HibernateUtil;

import java.util.Collection;
import java.util.Date;
import org.hibernate.Criteria;
import org.hibernate.Session;

public class TesteConexao {

    public static void main(String[] args) {
      
        
       Session secao = HibernateUtil.getSessionFactory().openSession();
      
        
        Editora editora = (Editora) secao.load(Editora.class,4);
        Secao s = (Secao) secao.load(Secao.class, 4);
        TipoCDDVD CddvdTipo = (TipoCDDVD) secao.load(TipoCDDVD.class, 1);
  
        Criteria criteria = secao.createCriteria(Autor.class);  
             Collection<Autor> a = (Collection<Autor>) criteria.list();

        CddvdDAO cddvd = new CddvdDAO();
        Cddvd c =  new Cddvd();
        
      c.setTxTitulo("A criação");
      c.setNuReferencia(123455657);
      c.setNuEdicao(2);
      c.setNuAnoEdicao(2010);
      c.setNuExemplar(45);
      c.setTxObservacao("Gravado em Nova York");
      c.setCodEditora(editora);
      c.setCodSecao(s);
      c.setItemBibliotecaAutorCollection(a);
      c.setTxConteudo("");
      c.setNuDuracao(new Date());
      c.setCodTipoCDDVD(CddvdTipo);
        
    }  
}

Como mostra o código de teste, estou tentando usar o criteria mas não sei como.
Podem me ajudar?
Obrigada! :smiley:

11 Respostas

L

mas o criteria até onde sei num serve para salvar…

J

Então qual código uso para cadastrar, já que o criteria não serve pra salvar?
:slight_smile:

K

[b]Eu num já te ensinei isso ontem, num deu certo não foi???

Vamos esperar o prof°…

kkkkkkkkkkk[/b]

J

E aí pessoal? Qual código utilizo para persistir os dados?

H

Como você está utilizando o hibernate puro, tenta o saveOrUpdate().

J

Em qual linha do código eu coloco o SaveOrUpdate?
Tem como me mostrar um exemplo de cadastro que usa uma relação @ManyToMany?

Ajuda, por favor! :cry:

J

Olá pessoal,

gostaria que me ajudassem num código que persista dados de uma classe livro que herda atributos da classe obra
que tem uma relação de @manytomany com a classe autor!

Como faço isso?

Este é o meu código que uso para testar a persistencia:
public static void main(String[] args) {
        Session secao = HibernateUtil.getSessionFactory().openSession();
        
        //Esta linha chama o ID da editora que o livro pertence
        Editora editora = (Editora) secao.load(Editora.class, 1);
        //Esta linha chama o ID da seção que o livro pertence
        Secao s = (Secao) secao.load(Secao.class, 1);
              
                         
        LivroDAO livroDAO = new LivroDAO();
        Livro l =  new Livro();
        
        l.setCodEditora(editora);
        l.setCodSecao(s);
        l.setItemBibliotecaAutorCollection(null);
        l.setTxTitulo("Linguagem Java");
        l.setNuReferencia(1275567);
        l.setNuEdicao(3);
        l.setNuAnoEdicao(2009);
        l.setNuExemplar(6);
        l.setNuVolume(2);
        l.setNuISBN(23154636);
        l.setTxObservacao("asfasdfdafssdfsdfsdfsdfsdfsdf");
        l.setDaCadastro(new Date());
        
        livroDAO.salvar(l);
    }
Como faço pra chamar os IDs dos autores para cadastrar o livro? Aí no código tem a seguinte linha
l.setItemBibliotecaAutorCollection(null);
chama um collection que é do relacionamento @ManyToMany que autor tem com a classe Obra, a qual a classe livro herda os atributos e relacionamentos. A dúvida é somente isso, como chamar os IDs do Autor para salvar esses dados. E só uma pergunta: O salvar tem que ser dado na classe livro ou na classe ObraAutor que é a classe criada por causa do relacionamento de muitos pra muitos.

Alguém me ajuda! :cry:

J

Oi gente!!

Estava dando uma pesquisada, e tentei usar o seguinte código para gravar dados de livro:
Session secao = HibernateUtil.getSessionFactory().openSession();
        
        Editora editora = (Editora) secao.get(Editora.class, 1);
        Secao s = (Secao) secao.get(Secao.class, 1);
                               
        LivroDAO livroDAO = new LivroDAO();
        Livro l =  new Livro();
        
        l.setCodEditora(editora);
        l.setCodSecao(s);
         
         Set<Integer> autores = new HashSet<Integer>();
          autores.add(2); 
          autores.add(3);
          l.setAutorCollection(autores);
        
        l.setTxTitulo("Linguagem Java");
        l.setNuReferencia(1275567);
        l.setNuEdicao(3);
        l.setNuAnoEdicao(2009);
        l.setNuExemplar(6);
        l.setNuVolume(2);
        l.setNuISBN(23154636);
        l.setTxObservacao("asfasdfdafssdfsdfsdfsdfsdfsdf");
        l.setDaCadastro(new Date());
                        
        livroDAO.salvar(l);
Usei este código para adicionar mais de um autor:
Set<Integer> autores = new HashSet<Integer>();
          autores.add(2); 
          autores.add(3);
          l.setAutorCollection(autores);
Mas tem um erro na linha
l.setAutorCollection(autores);
que diz: [color=red]method setAutorCollection in class br.com.Dominio.ItemBiblioteca cannot be applied to given types; required: java.util.Collection found: java.util.Set reason: actual argument java.util.Set cannot be converted to java.util.Collection by method invocation conversion [/color]. Utilizo o Collection e aí como faço isso?

Ajudem-me!
:cry:

H

Exemplo para realizar o saveOrUpdade

Session session = HibernateUtil.getSession();  
session.beginTransaction();  
session.saveOrUpdate(obj);  
session.getTransaction().commit();

Este erro :

method setAutorCollection in class br.com.Dominio.ItemBiblioteca cannot be applied to given types;

required: java.util.Collection<br.com.Dominio.Autor>

found: java.util.Set<java.lang.Integer>

reason: actual argument java.util.Set<java.lang.Integer> cannot be converted to java.util.Collection<br.com.Dominio.Autor> by method invocation conversion

é causado por Tipos incompatíveis, ou seja seu método l.setAutorCollection(), esta recebendo um SET de Integer e esperando Collection de Autor, segue um exemplo abaixo. pra ver se facilita.

Set&lt;Autor&gt; autores = new HashSet&lt;Autor&gt;();  
      autores.add(new Autor('Nome1','Sobrenome1'));   
      autores.add(new Autor('Nome2','Sobrenome2'));   
      l.setAutorCollection(autores);
J

Oi, honjoya.

Tentei fazer do jeito que me propôs, mas não deu certo.

Tentei o seguinte:
public static void main(String[] args) {
        
        Session secao = HibernateUtil.getSessionFactory().openSession();
                    
        Editora editora = (Editora) secao.get(Editora.class, 1);
        Secao s = (Secao) secao.get(Secao.class, 3);
                       
        LivroDAO livroDAO = new LivroDAO();
        Livro l =  new Livro();
        
        l.setCodEditora(editora);
        l.setCodSecao(s);
        
        Collection<Autor> autores = new HashSet<Autor>();
          Autor a = (Autor) secao.get(Autor.class, 2); 
          Autor au = (Autor) secao.get(Autor.class, 3);
        l.setAutorCollection(autores);
        
        l.setTxTitulo("Livro");
        l.setNuReferencia(1275567);
        l.setNuEdicao(3);
        l.setNuAnoEdicao(2010);
        l.setNuExemplar(5);
        l.setNuVolume(3);
        l.setNuISBN(1234545);
        l.setTxObservacao("asferasdfdafssdfsdfsdfsdfsdfsdf");
        l.setDaCadastro(new Date());
        
        livroDAO.salvar(l); 
        
    }

Os dados é salvo no BD, mas sem cadastrar autor.
Veja, tenho um relacionamento de ManyToMany.
Usando o Hibernate, preciso criar uma classe, para este caso, ObraAutor, além de criar um classe PK para esta.
Como faço pra dar também um save para cadastrar na tabela ObraAutor o ID de livro (A obra) e os IDs de Autor?

Ajuda!

J

Olá!
Para persistir dados de classes que possuem relacionamento N:M, quando se usa a plataforma NetBeans IDE + Framework Hibernate + Banco De Dados SQL Server 2008, fazemos o seguinte:

(EXEMPLO DE CADASTRO DE OBRAS DE UMA BIBLIOTECA)

Neste exemplo temos as seguintes classes de domínio, sendo que o relacionamento de N:M está entre OBRA E AUTOR e ambas utilizam o Annotation @ManyToMany, veja os códigos de cada classe: Classe OBRA (a qual será a super classe):
package Dominio;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

@Entity
//Este annotation é para a herança que há entre OBRA e LIVRO.
@Inheritance(strategy= InheritanceType.JOINED)
@Table(name = "Obra", catalog = "bdTesteManyToMany", schema = "dbo")

@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Obra.findAll", query = "SELECT o FROM Obra o"),
    @NamedQuery(name = "Obra.findByCodObra", query = "SELECT o FROM Obra o WHERE o.codObra = :codObra"),
    @NamedQuery(name = "Obra.findByTitulo", query = "SELECT o FROM Obra o WHERE o.titulo = :titulo")})

public class Obra implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    //Este Annotation é para auto incrementar o ID. Como estou usando o SQL Serve 2008 uso o Identity. E este annotation só deve ser utilizado se a classe no Banco de dados já estiver definido o auto incremento.
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name = "CodObra", nullable = false)
    private Integer codObra;
    @Column(name = "Titulo", length = 30)
    private String titulo;
    
   //Este é o código do relacionamento @ManyToMany para a classe OBRA.
   //O FetchType.LAZY significa que o conteúdo da super classe será trazido apenas na primeira solicitação. 
   @ManyToMany(fetch= FetchType.LAZY) 
   @JoinTable(name="ObraAutor", joinColumns={@JoinColumn(name="CodObra")},
            inverseJoinColumns={@JoinColumn(name="CodAutor")})
   //O Annotation Cascade mostra uma opção de executar todos os comandos nas classes relacionadas. Ou seja, o que ocorrer na super classe irá ocorrer nas subclasses.
   @Cascade(CascadeType.ALL)
  //O ArrayList irá criar um lista de autores para as obras que serão cadastradas.
    private Collection <Autor> autor = new ArrayList<Autor>();
     
    public Obra() {
    }

    public Obra(Integer codObra) {
        this.codObra = codObra;
    }

    public Integer getCodObra() {
        return codObra;
    }

    public void setCodObra(Integer codObra) {
        this.codObra = codObra;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }
   
    @XmlTransient
    public Collection<Autor> getAutor() {
        return autor;
    }

    public void setAutorCollection(Collection<Autor> autor) {
        this.autor = autor;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (codObra != null ? codObra.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Obra)) {
            return false;
        }
        Obra other = (Obra) object;
        if ((this.codObra == null && other.codObra != null) || (this.codObra != null && !this.codObra.equals(other.codObra))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Dominio.Obra[ codObra=" + codObra + " ]";
    }
}
Classe LIVRO (Herdará atributos da super classe OBRA):
package Dominio;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;

@Entity
//Este annotation indica a PK para esta classe, de acordo com a herança. Neste caso será necessário retirar todos os códigos relacionados ao ID da classe LIVRO.
@PrimaryKeyJoinColumn(name="CodObra")
@Table(name = "Livro", catalog = "bdTesteManyToMany", schema = "dbo")

@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Livro.findAll", query = "SELECT l FROM Livro l"),
    @NamedQuery(name = "Livro.findByIsbn", query = "SELECT l FROM Livro l WHERE l.isbn = :isbn"),
    @NamedQuery(name = "Livro.findByCodObra", query = "SELECT l FROM Livro l WHERE l.codObra = :codObra")})

public class Livro extends Obra implements Serializable {
    private static final long serialVersionUID = 1L;
    @Column(name = "ISBN")
    private Integer isbn;
   
    public Livro() {
    }

    public Integer getIsbn() {
        return isbn;
    }

    public void setIsbn(Integer isbn) {
        this.isbn = isbn;
    }

    @Override
    public String toString() {
        //Retirando o ID da classe LIVRO, é necessário especificar nesta função que ela deve retornar o código da classe OBRA.
        return "Dominio.Livro[ codObra=" + getCodObra() + " ]";
    }
    
}
Classe AUTOR:
package Dominio;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

@Entity
@Table(name = "Autor", catalog = "bdTesteManyToMany", schema = "dbo")

@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Autor.findAll", query = "SELECT a FROM Autor a"),
    @NamedQuery(name = "Autor.findByCodAutor", query = "SELECT a FROM Autor a WHERE a.codAutor = :codAutor"),
    @NamedQuery(name = "Autor.findByNome", query = "SELECT a FROM Autor a WHERE a.nome = :nome")})

public class Autor implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "CodAutor", nullable = false)
    private Integer codAutor;
    @Column(name = "Nome", length = 30)
    private String nome;
    
     //Este é o código do relacionamento @ManyToMany para a classe AUTOR.
    //O FetchType.LAZY significa que o conteúdo da super classe será trazido apenas na primeira solicitação.
    @ManyToMany(fetch= FetchType.LAZY) 
    @JoinTable(name="ObraAutor", joinColumns={@JoinColumn(name="CodAutor")},
            inverseJoinColumns={@JoinColumn(name="CodObra")}) 
   //O Annotation Cascade mostra uma opção de executar todos os comandos nas classes relacionadas. Ou seja, o que ocorrer na super classe irá ocorrer nas subclasses.
    @Cascade(CascadeType.ALL)
 //O ArrayList irá criar um lista de Obras para os autores que serão cadastradas.
    private Collection <Obra> obra = new ArrayList<Obra>();

    public Autor() {
    }

    public Autor(Integer codAutor) {
        this.codAutor = codAutor;
    }

    public Integer getCodAutor() {
        return codAutor;
    }

    public void setCodAutor(Integer codAutor) {
        this.codAutor = codAutor;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    @XmlTransient
    public Collection<Obra> getObra() {
        return obra;
    }

    public void setObraCollection(Collection<Obra> obra) {
        this.obra = obra;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (codAutor != null ? codAutor.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Autor)) {
            return false;
        }
        Autor other = (Autor) object;
        if ((this.codAutor == null && other.codAutor != null) || (this.codAutor != null && !this.codAutor.equals(other.codAutor))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Dominio.Autor[ codAutor=" + codAutor + " ]";
    }  
}
Para se estabelecer o relacionamento quando usa o Hibernate, temos mais duas classes: Classe OBRAAUTOR:
package Dominio;

import java.io.Serializable;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(name = "ObraAutor", catalog = "bdTesteManyToMany", schema = "dbo")
    
    public class ObraAutor implements Serializable {
    
    //@EmbeddedId indica que a chave primária da tabela ObraAutor é composta.
    @EmbeddedId
    private ObraAutorPK chaveComposta;
    
}
Classe OBRAAUTORpk, que é criada porque o hibernate não suporta a chave composta numa mesma classe [Se eu estiver errada me digam! kkkkkkkkk, pois estou aprendendo agora...]:
[code]
package Dominio;

import java.io.Serializable;
import javax.persistence.Embeddable;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

//@Embeddable significa que a classe não persiste sozinha.
@Embeddable
public class ObraAutorPK implements Serializable {
    
    //O FetchType.EAGER significa que o conteúdo da super classe será trazido todas as vezes que houver solicitações.
    @ManyToOne(fetch= FetchType.EAGER)
    @JoinColumn(name="CodObra")
    @Cascade(CascadeType.ALL)
    private Obra obra;
    
    @ManyToOne(fetch= FetchType.EAGER)
    @JoinColumn(name="CodAutor")
    @Cascade(CascadeType.ALL)
    private Autor autor;
}

E é isso gente!!
Até mais!
:D

Criado 11 de janeiro de 2012
Ultima resposta 23 de jan. de 2012
Respostas 11
Participantes 5