@OneToMany Recursivo

1 resposta
sandro.csimas

Galera, meu primeiro post aqui… comecei a estudar Hibernate e estou tendo dificuldades em fazer um certo relacionamento
Tenho uma tabela Usuario que tem os atributos:

id
nome
email
senha
endereco
nascimento
dataCadastro

… até ai tudo bem. Só que é o seguinte, eu quero que um usuario tenha uma lista de amigos (que tambem é do tipo Usuario)
é um relacionamento 1-n não é isso ?

Alguem pode me dar uma dica de como fazer isso ?

eu tentei desse jeito:

@OneToMany(fetch=FetchType.LAZY)

@JoinTable(name=Amizade, joinColumns=@JoinColumn(name=id_usuario), inverseJoinColumns=@JoinColumn(name=id_amigo))

@Cascade(CascadeType.ALL)

private Collection amigos;

isso gera uma tabela “Amizade” com os campos id_usuario e id_amigo(chave primaria)

Se eu rodar o seguinte programa ele insere certo.

Usuario user   = (Usuario)HibernateUtil.getSession().get(Usuario.class, 1L);
	Usuario user2 = (Usuario)HibernateUtil.getSession().get(Usuario.class, 2L);
	Usuario user3 = (Usuario)HibernateUtil.getSession().get(Usuario.class, 3L);
	Usuario user4 = (Usuario)HibernateUtil.getSession().get(Usuario.class, 4L);
	Usuario user5 = (Usuario)HibernateUtil.getSession().get(Usuario.class, 5L);

	user.getAmigos().add(user2);
	user.getAmigos().add(user3);
	user.getAmigos().add(user4);
	user.getAmigos().add(user5);

           HibernateUtil.getSession().update(user);

Minha duvida é … O meu relacionamento la de List amigos está correto ?

Se eu rodar o programa acima, ele adiciona na tabela amizade todos os amigos inseridos na lista.
Desse jeito se eu recuperar o user2 … na lista de amigos dele nao terá o user (o primeiro)

E se eu fizer:

user.getAmigos().add(user2);
	user2.getAmigos().add(user);
	user.getAmigos().add(user3);
	user3.getAmigos().add(user);

e salvar o user… diz que o campo nao pode ser duplicado
Duplicate entry ‘1’ for key ‘id_amigo’

Alguem pode me orientar ?
Valeu, agradeço desde já.

1 Resposta

victorwss

Use @ManyToMany ao invés de @OneToMany.

Criado 26 de janeiro de 2010
Ultima resposta 26 de jan. de 2010
Respostas 1
Participantes 2