2009-12-03 3 views
0

Я пытаюсь создать отношение «многие ко многим» между двумя типами, которые являются перечисляемым типом. Допустим, первая модель - это User, а вторая - Role. Пользователь может иметь много ролей, и роль может принадлежать многим пользователям.Связь с перечисляемым типом в Java

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

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

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

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

-gearoid

UPDATE: Может кто-то указать, как сохранить в EnumSet на модели? Информация выше все еще стоит, я хочу создать отношения ManyToMany с Перечислимым типом.

+0

Почему @Enumerated не соответствует вашим потребностям? – Romain

ответ

1

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

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.

2

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

+0

Спасибо - я не думаю, что у вас есть пример того, где EnumSet используется во взаимоотношениях «многие ко многим»? – Ger

+0

Не можете ли вы добавить экземпляр EnumSet к перечислениям пользователя и роли, удерживая экземпляры другого типа? – thecoop

+0

Ну, нумерованный тип только на одной стороне отношений. Позволяет просто сказать, что у меня просто была модель EnumSet на модели User (забудьте о модели роли сейчас) - как это будет сохраняться? Я попытался реализовать его, но я получаю сообщение об ошибке: «Данные слишком длинны для столбца», когда я пытаюсь сохранить ... – Ger

0

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