No tutorial do Hibernate ele explica como criar e proteger relacionamentos bi-direcionais. Só ficou a seguinte dúvida:
Pessoas tem eventos e Eventos tem pessoas.
private Set participants = new HashSet();
protected void setParticipants(Set participants) {
this.participants = participants;
}
protected Set getParticipants() {
return participants;
}
public void addParticipant(Person p) {
participants.add(p);
p.events.add(this); // é! isso funciona para protected...
}
public void delParticipant(Person p) {
participants.remove(p);
p.events.remove(this);
}
Beleza. Não tem como ninguém modificar o set participants sem passar pelo add e pelo del.
Só que eu quero ter acesso ao Set para listar os participantes, isto é, quero ter um método publico getParticipants(). Só que aí a segurança é perdida, pois qualquer um poderia meter um participante no set depois de charmar getParticipants().
Soluções:
- No getParticipants() fazer return Collections.unmodifiableSet(participants); (NAO FUNCIONA NO HIBERNATE!)
Erro: Exception in thread “main” org.hibernate.AssertionFailure: collection was not processed by flush()
-
No getParticipants() dar um clone no Set antes de retornar. Não testei isso, mas se a lista for muito grande isso deve ser uma bosta. Ainda mais que o Hibernate tá acessando essa função toda hora!
-
Criar um outro método público e deixar o getParticipants() privado mesmo. Ex:
public Set getParticipantsSet() {
return Collections.unmodifiableSet(participants);
}
Mas aí o nome vai está fora do padrão JavaBean e vou ter que fazer: user.participantsSet na camada view.
- Deixar aberto mesmo e confiar que ninguem vai adicionar um participante por fora.
Qual é a melhor solução: 1), 2), 3) ou 4) ???


