Relacionamento com tipo enumerado em Java
-
12-09-2019 - |
Pergunta
Eu estou tentando criar um relacionamento muitos-para-muitos entre dois tipos, dos quais um é um tipo enumerado. Vamos dizer que o primeiro modelo é usuário e o segundo modelo é o papel. Um usuário pode ter muitos papéis e um papel pode pertencer a muitos usuários.
Eu gostaria de ser capaz de escrever código simples como:
if (user.getRoles().contains(Role.ADMIN)) {
//do something
}
Alguém sabe se isso é possível? Eu vi que há uma anotação @Enumerated Hibernate, mas isso não parece ser de utilidade para mim.
Eu tenho atualmente implementada uma solução por criou um modelo para uma tabela de ligação, mas isso é muito confuso. Qualquer ajuda muito apreciado.
-gearoid
UPDATE: alguém pode especificar como persistir um EnumSet em um modelo? A informação acima ainda está de pé, eu gostaria de criar uma relação ManyToMany com um tipo enumerado.
Solução 2
Eu acho que encontrei uma boa solução para o problema. Se eu manter o meu tipo enumerado como algo simples, como:
public enum Role implements Serializable{
USER, MODERATOR, ADMIN;
}
E, em seguida, no meu modelo de usuário para criar um conjunto de papéis com os @CollectionOfElements por isso é algo como isto:
@CollectionOfElements(fetch = FetchType.EAGER)
public Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
Hibernate parece criar uma tabela para essa relação (chamados user_roles) que funciona como eu gostaria (A relação regular ManyToMany).
Espero que isso ajude alguém.
-gearoid.
Outras dicas
Você teve uma olhada na EnumSet classe? Isto pode armazenar várias instâncias ENUM em uma coleção que você pode chamar contains()
on
Nós geralmente criam subclasses EnumUserType e especifique essa classe no arquivo de mapeamento.