Pregunta

Estoy tratando de crear una relación de muchos a muchos entre dos tipos de los cuales uno es un tipo enumerado. Digamos el primer modelo de usuario y es el segundo modelo es el papel. Un usuario puede tener muchas funciones y una función puede pertenecer a muchos usuarios.

Me gustaría ser capaz de escribir código simple como:

if (user.getRoles().contains(Role.ADMIN)) {
  //do something
}

¿Alguien sabe si esto es posible? He visto que hay una anotación @Enumerated Hibernate, pero esto no parece ser de utilidad para mí.

He implementado actualmente una solución mediante creado un modelo para una mesa de enlace, pero esto es muy desordenado. Cualquier ayuda muy apreciada.

-gearoid

ACTUALIZACIÓN: ¿Alguien puede especificar la forma en que persista un EnumSet en un modelo? La información anterior sigue en pie, deseo de crear una relación ManyToMany con un tipo enumerado.

¿Fue útil?

Solución 2

Creo que he encontrado una buena solución al problema. Si sigo mi tipo enumerado como algo simple, como:

public enum Role implements Serializable{

    USER, MODERATOR, ADMIN;

}

Y a continuación, en mi modelo de usuario se crea un conjunto de roles con los @CollectionOfElements por lo que se ve algo como esto:

  @CollectionOfElements(fetch = FetchType.EAGER)
  public Set<Role> getRoles() {
      return roles;
  }

  public void setRoles(Set<Role> roles) {
      this.roles = roles;
  }

Hibernate parece crear una mesa para esta relación (llamados user_roles), que funciona como me gustaría (una relación regular ManyToMany).

Espero que esto ayude a alguien.

-gearoid.

Otros consejos

¿Ha tenido un vistazo a la EnumSet clase? Esto puede almacenar varias instancias de enumeración de una colección puede llamar en contains()

Por lo general, crear subclases EnumUserType y especifique esta clase en el archivo de asignación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top