Many to Many não faz nada no hibernate :(

1 resposta
M

Fala feras :smiley:

Tenho 3 tabelas pra criar meu relacionamento N-N só que não estou conseguindo fazer isso no Hibernate. Mapiei minhas tabelas da seguinte maneira:

IdiomaPessoaTO -> Tabela que vai mapear os relacioanemtnso entre as tabelas das entidades PessoaTO e IdiomaTO

@Entity
@Table(name="IDIOMA_PESSOA")
public class IdiomaPessoaTO implements Serializable {
	
	private static final long serialVersionUID = 1L;

	@Id
	private IdiomaPessoaPK idiomaPessoaPK = new IdiomaPessoaPK();
	
    @Column(name="ID_IDIOMA", nullable=false, updatable=false, insertable=false)
    @SuppressWarnings("unused")
	private Long idioma;
	
    @Column(name="ID_PESSOA", nullable=false, updatable=false, insertable=false)
    @SuppressWarnings("unused")
	private Long pessoa;
	
	@Column(name="NIVEL_CONHECIMENTO")
	@Enumerated(EnumType.STRING)
	private NivelConhecimento nivelConhecimento;
	
	public IdiomaPessoaPK getIdiomaPessoaPK() {
		return idiomaPessoaPK;
	}

	public void setIdiomaPessoaPK(IdiomaPessoaPK idiomaPessoaPK) {
		this.idiomaPessoaPK = idiomaPessoaPK;
	}

	public IdiomaTO getIdiomaTO() {
		return idiomaPessoaPK.getIdiomaTO();
	}

	public void setIdiomaTO(IdiomaTO idiomaTO) {
		this.idiomaPessoaPK.setIdiomaTO(idiomaTO);
	}

	public PessoaTO getPessoaTO() {
		return idiomaPessoaPK.getPessoaTO();
	}

	public void setPessoaTO(PessoaTO pessoaTO) {
		this.idiomaPessoaPK.setPessoaTO(pessoaTO);
	}

	public NivelConhecimento getNivelConhecimento() {
		return nivelConhecimento;
	}

	public void setNivelConhecimento(NivelConhecimento nivelConhecimento) {
		this.nivelConhecimento = nivelConhecimento;
	} 
	
	@Embeddable
	private class IdiomaPessoaPK implements Serializable {

		private static final long serialVersionUID = 1L;

		@ManyToOne
		private IdiomaTO idiomaTO;
		
		@ManyToOne
		private PessoaTO pessoaTO;

		//gettes setters
	}
}

PessoaTO

@OneToMany(mappedBy="pessoa")
	private Collection<IdiomaPessoaTO> idiomas;

IdiomaTO

@OneToMany(mappedBy="idioma")
	private List<IdiomaPessoaTO> pessoas;

A tabela de Idiomas apenas vai armazenar uma lista de idiomas e seu id deverá fazer referência com os objetos Pessoa que selecionamente. Após o mapeamento, eu tentei fazer no service:

pessoaDAO.save(pessoaTO);

O problema é que os relacionamento 1-1 sao inseridos normalmente mas os que são mais de 1, não fazem nada…não inserem e nem dão erro. O que estou errando?

Abs

1 Resposta

partenon

Bom, tecnicamente, este nao eh um relacionamento N-N. Isso sao dois relacionamentos 1-N. Veja:

Uma Pessoa tem ConhecimentoIdioma (1-N)
ConhecimentoIdioma consiste em nivel de proficiencia e em um idioma (a partir que o “relacionamento” tenha uma propriedade extra, ele deixa de ser uma tabela de ligacao ou relacionamento para ser uma entidade por si so).
Um Idioma nao “pertence” a nenhuma pessoa (eh a ponta “passiva” do relacionamento). Nao faz sentido ligar de volta o idioma (bi-directional relationship), mas ele tambem seria um 1-N se for mapeado.

Eu recomendaria fazer assim, caso tenha flexibilidade para mudar:

class Pessoa {
  @OneToMany
  List<ConhecimentoIdioma> idiomas;
}

class ConhecimentoIdioma {
  @ManyToOne
  Idioma idioma;

  @Column
  @Enumerated
  NivelConhecimento conhecimento;
}

class Idioma {}

Mas caso realmente precise fazer do jeito que esta tentando, eu diria que o problema eh que vc nao esta mapeando os relacionamentos em seu IdiomaPessoaTO (alem do que, vc esta usando um Long para representar um idioma e uma pessoa). O correto seria usar IdiomaTO e PessoaTO (no lugar de Long) e mapear os relacionamentos como dois ManyToOne no IdiomaPessoaTO (e OneToMany com mappedBy nas outras pontas):

@ManyToOne
  public IdiomaTO getIdiomaTO()...
  @ManyToOne
  public PessoaTO getPessoaTO()...
Criado 17 de junho de 2010
Ultima resposta 28 de jun. de 2010
Respostas 1
Participantes 2