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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top