Связь с перечисляемым типом в Java - PullRequest
0 голосов
/ 03 декабря 2009

Я пытаюсь создать отношение «многие ко многим» между двумя типами, один из которых является типом Enumerated. Допустим, первая модель - Пользователь, а вторая - Роль. Пользователь может иметь много ролей, а роль может принадлежать многим пользователям.

Я бы хотел написать простой код вроде:

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

Кто-нибудь знает, возможно ли это? Я видел, что есть аннотация @Enumerated Hibernate, но она не кажется мне полезной.

В настоящее время я реализовал решение, создав модель таблицы ссылок, но это очень грязно. Любая помощь высоко ценится.

-gearoid

ОБНОВЛЕНИЕ: Может кто-нибудь указать, как сохранить EnumSet на модели? Информация выше остается в силе, я хочу создать связь ManyToMany с перечисляемым типом.

Ответы [ 3 ]

2 голосов
/ 03 декабря 2009

Вы смотрели на класс EnumSet ? Это может хранить несколько экземпляров Enum в коллекции, которую вы можете вызвать contains() на

1 голос
/ 04 декабря 2009

Я думаю, что нашел хорошее решение проблемы. Если я сохраню свой перечисляемый тип как нечто простое, например:

public enum Role implements Serializable{

    USER, MODERATOR, ADMIN;

}

А затем в моей модели User я создаю набор ролей с @CollectionOfElements, чтобы он выглядел примерно так:

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

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

Hibernate, кажется, создает таблицу для этого отношения (называемую user_roles), которая работает так, как я хотел бы (обычное отношение manyToMany).

Надеюсь, это кому-нибудь поможет.

-gearoid.

0 голосов
/ 03 декабря 2009

Обычно мы создаем подклассы EnumUserType и затем указываем этот класс в файле отображения.

...