Usuário de Rede social - Relacionamento Hibernate

Olá, pessoas!

Me intriguei hoje que fui começar a fazer um modulo de uma rede social.

Na modelagem de um usuário eu tenho as informações normais e a sua lista de amigos

public class Usuario {
    // nome, login, senha, endereço
    public List<Usuario> amigos;
}

Fico em dúvida em como mapear o relacionamento, já que ele existe em uma classe apenas.

Normalmente, em um set ou lista de outro tipo, eu teria um OneToMany e ManyToOne no outro objeto.

Mas aqui, se fosse acontecer, daria um ManyToMany no fim.

Mesmo que fosse mapear usando um ManyToMany, onde ficariam a outra annotation além da

@ManyToMany
public List<Usuario> amigos;

Talvez esteja fazendo/pensando da maneira errada. Espero ajuda! Abraços

tpmarc, você conseguiu fazer o relacionamento?

Não seria melhor ter uma tabela de relacionamentos? Usar uma lista para armazenar centenas de amigos é uma boa?

Alguém experiente, ou com alguma idéia melhor, para dar uma luz?

Eh verdade,

O ideal seria criar uma tabela de contatos que vai conter dois usuarios que sao amigos e tb vc poderia adicionar um campo que guarde
o status do contato, que poder ser tipo

Suponha que vc tenha usuario A e usuario B:

  • Pending (quando um usuario A solicitou amizade um outro usuario B mas o usuario B ainda nao aceitou ser amigo)
  • Approved ( quando o usuario B aceitou a solicitacao e eh amigo do usuario A.

Porque ai da pra vc da pra saber todos os ‘Friendship requests’ que um determinado usuario tem, ou solicitou.

//Daniel

Daniel (windsofhell), é uma boa, e podemos ir mais além!
Quando um usuário solicita a amizade de alguém, poderíamos criar a tabela de “pedidosRelacionamentos”, onde existe uma coluna com usuário B e outra coluna com usuário A, o que significa que B está pedindo amizade com A.
Com isto poderíamos dividir melhor, e fazer uma seção para o usuário B de “minhas solicitações”, e uma seção para o usuário A de “pedidos de amizade”, fazendo um where ou criteria pelas colunas.

Após A aceitar, iríamos adicionar na tabela “amizades” o registro que A e B são amigos :slight_smile:
O problema que fica em minha cabeça é, digamos que queremos listar os amigos do usuário A, mas na tabela “amizades”, existe coluna1: B, coluna2: A. Se dermos um where na coluna1 pegaremos os amigos que o A adicionou, e não os que adicionaram ele. Temos dois jeitos de resolver:

  1. Dar where tanto na coluna1 como na coluna2
  2. Ao um usuário aceitar o outro, criar dois registros na tabela amizades, com: B-A e A-B

Em ambos não vejo como uma boa prática. Pelo Hibernate e com o mapeamento das entidades, deve ter um jeito mais fácil de relacionar essas informações. Alguém pode ajudar com este mapeamento e relação?

Engraçado que no momento não estou desenvolvendo nada, mas deu uma vontade de voltar e fazer uma mini rede social! haha

Algum moderador pode mover este tópico para “Persistência: Hibernate, JPA, JDBC e outros”?

Bom deixe-me reviver o topico, estou com um problema pareceido do nossa amigo. Mas no meu caso tenho uma tabela de MIDIA e quero fazer um relacionamento MIDIA > MIDIA (1 > N).
O problema é o seguinte quando salvo o relacinamento no banco aparece corretamento quando vou consultar o hibernate duplica a iniformação. Ou seja se na banco a midia tem 1 relacionamento com outra
quando consulto este valor aparece 2 na tela.

Classe Midia.java

@Entity
public class Midia extends Model {

	@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "relatedMidia_fk")
	private List<RelatedMidia> referencias = new ArrayList<RelatedMidia>();
}

Classe RelatedMidia.java

@Entity
public class RelatedMidia extends Model {
	
	@Required(message = "dsphere.erro.refer.tipo.relacao.required")
	private String tipoRelacionamento;
	
	@OneToOne(targetEntity = Midia.class) 
	@JoinColumn(name = "FK_midia_relacionado", referencedColumnName = "id")
	private Midia midiaRelacionada;
	
	@ManyToOne
    @JoinColumn(name="relatedMidia_fk", insertable=false, updatable=false)
	private Midia relatedMidia;
}

OBS: o problema só ocorre quando cadastro a midia via sistema.

Rafael