Duvida ManyToMany - Hibernate

5 respostas
Jeferson_Manetti

ola,

bom estou com a seguinte duvida...

fiz meu mapeamento ManyToMany no hibernate...
// imports

@Entity
public class UnidadeNegocio implements java.io.Serializable {

	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private Long id;
	
	@Column(nullable=false)
	private String nome;
	
	private String decricao;
	
	@ManyToMany(cascade=CascadeType.ALL)
        @JoinTable(name="Unid_Indice",
           joinColumns= @JoinColumn(name="id_UnidadeNegocio", referencedColumnName="id"),
           inverseJoinColumns= @JoinColumn(name="id_Indice", referencedColumnName="id"))
	private List<Indice> indices;
	
	public UnidadeNegocio() {
		this.indices = new ArrayList<Indice>();
	}

// getter and setter... equals e hashcoce....
// imports

@Entity
@Table(name="Indices")
public class Indice implements java.io.Serializable{

	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private Long id;
	
	@Column(nullable=false)
	private String nome;
	
	private String descricao;
	
	@ManyToMany(cascade=CascadeType.ALL)
        @JoinTable(name="Unid_Indice",
           joinColumns= @JoinColumn(name="id_Indice", referencedColumnName="id"),
           inverseJoinColumns= @JoinColumn(name="id_UnidadeNegocio", referencedColumnName="id"))
	private List<UnidadeNegocio> unidadesNegocio;
	
	//@OneToMany(mappedBy="indice")
	//private List<Lancamento> lanctos;
	
	public Indice() {
            this.unidadesNegocio = new ArrayList<UnidadeNegocio>();
            //this.lanctos = new ArrayList<Lancamento>();
	}
// getter and setter... equals and hashcode
iserindo dados...
public class TesteInsert {

    public static void main(String args[]){
        
        Session session = HibernateUtil.getSession();
        
        session.beginTransaction();
        
        UnidadeNegocio unid = new UnidadeNegocio();
        unid.setNome("Indaiatuba");
        unid.setDecricao("Filial de Indaiatuba");
        
        session.save(unid);
        
        Indice ind = new Indice();
        ind.setNome("Tx Frequencia");
        ind.setDescricao("Calcula Taxa");
        
        session.save(ind);
        
        /* minha duvida/problema esta aqui...
        * em todo lugar diz q eu tenho q fazer assim... setando um no outro...
        * porem isso aqui faz 2 inserts na minha tabela de relacionamento =(
        * o certo seria 1 insert apenas... 
        * oq sera q estou fazendo de errado... */
        unid.getIndices().add(ind);
        ind.getUnidadesNegocio().add(unid);
      
       /* se eu fizer assim funciona
        * unid.getIndices().add(ind); */
       
       /* ou assim
        * ind.getUnidadesNegocio().add(unid); */

      // ate pensei q era culpa do cascade.ALL mais sem ele ocorre o mesmo problema =(

        
        //UnidadeNegocio unid2 = (UnidadeNegocio) session.get(UnidadeNegocio.class, 1l);
        ///Indice ind2 = (Indice) session.get(Indice.class, 1l);
        
        //unid2.getIndices().add(ind2);
        //ind2.getUnidadesNegocio().add(unid2);

        
        session.getTransaction().commit();

    }
    
}

alguma alma generosa poderia me ajudar =)

5 Respostas

Jeferson_Manetti

ninguem…

:cry:

von.juliano

Faltou indicar ao Hibernate que o relacionamento está mapeado do outro lado. Na classe Indice, inclua na annotation parâmetro mappedBy:

@ManyToMany(mappedBy = "indices") private List<UnidadeNegocio> unidadesNegocio;Vê se resolve! Flw! :thumbup:

Jeferson_Manetti

valeu cara!!!

funcionou…

apenas não entendi muito bem…

sempre uso a tag mappedBy em relacionamentos oneToMany…

achei q não haveria necessidade em ManyToMany ^^

mais mesmo assim obrigado!!!

Lavieri

ahh e fora isso… não acho a melhor abordagem deixar a cargo dos outros essa inclusão dupla que tal assim ??

Indice.javapublic void addUnidadesNegocio(UnidadeNegocio unidade) { if (unidade == null) return; getUnidadesNegocio().add(unidade); if (!unidade.contains(this)) unidade.addIndices(this); }

UnidadeNegocio.javapublic void addIndices(Indice indice) { if (indice == null) return; getIndices().add(indice); if (!indice.contains(this); indice.addUnidadesNegocio(this); }

Jeferson_Manetti

Lavieri
bem legal sua abordagem… deixando a responsabilidade de fazer essas atribuições a classe…
“abstraindo” isso do programandor…

dai e so fazer assim:

ou assim…

=)

bom ainda estou em duvida no mapedBy…
no caso coloquei na classe indice… teria que coloca-lo na UnidadeNegocio tambem?
ou se eu colocar apenas na Unidade tambem estaria “correto”?

isso ficou meio confusso pra mim =(

Criado 26 de março de 2009
Ultima resposta 28 de mar. de 2009
Respostas 5
Participantes 3