Заполните таблицу базы данных значениями перечисления в спящем режиме - PullRequest
4 голосов
/ 11 апреля 2011

есть ли возможность позволить Hibernate (3.6) заполнять таблицу базы данных значениями для данного перечисления? У меня есть следующий класс:

@Entity
public enum Role
{
    ROLE_USER_FREE("ROLE_USER_FREE"),
    ROLE_USER_STANDARD("ROLE_USER_STANDARD"),
    ROLE_USER_PREMIUM("ROLE_USER_PREMIUM"),
    ROLE_ADMIN("ROLE_ADMIN");
    ... constructor / setter / getter etc.
}

Я могу использовать это перечисление без проблем из другого класса сущностей, используя

@Enumerated(EnumType.STRING)
public Role getRole()

Мой вопрос: как я могу автоматически заполнить соответствующую таблицу ROLE? Вся основная логика и определения находятся в спецификации XML. Конечно, я могу с помощью XSL сгенерировать sql-файл из этой спецификации и позволить Hibernate импортировать его по семантике import.sql при запуске ... Но есть ли более элегантный способ?

Таблица должна выглядеть так:

|RoleID|RoleName      |
|  0   |ROLE_USER_FREE|
....

Ответы [ 2 ]

7 голосов
/ 11 апреля 2011

Вы должны выбрать сторону - либо вы собираетесь использовать Role в качестве enum или в качестве сущности.Вы пытаетесь сделать и то и другое, и это только приведет к неприятностям на дороге.

Если вы хотите использовать enum

  • Удалить @Entityаннотация от Role.Это не сущность, у нее нет первичного ключа.Он также не должен быть изменяемым, поэтому нет смысла сохранять его.
  • Удалить таблицу Roles (или как она там называется) из базы данных.Hibernate сохраняет перечисления по имени (если вы используете отображение @Enumerated(EnumType.STRING)) или по индексу в массиве values() (если вы используете аннотацию @Enumerated(EnumType.ORDINAL)).В любом случае, он никогда не будет ссылаться на вашу дополнительную таблицу.С вашим отображением (@Enumerated(EnumType.STRING)) бессмысленно начинать с RoleID.

Если вы хотите использовать сущность

  • Сделайте Role истинной сущностью - POJO с геттерами / сеттерами и идентификатором.Он может изменяться или не изменяться в зависимости от того, что вы хотите.
  • Сопоставьте его с таблицей «Роли».
  • Ссылка на @ManyToOne в других таблицах.
  • Вам придется самостоятельно заполнить стол;для Hibernate нет встроенного способа сделать это за вас.
4 голосов
/ 04 декабря 2012

Это хорошо заполняет мою базу данных

public class Person implements UserAccount
{
    public static enum Role
    {
        anon(6), admin(1), standard(4), manager(3), user(5), director(2);
        private int weight;

        Role(int weight)
        {
            this.weight = weight;
        }

        public int weight()
        {
            return weight;
        }
    }

    @ElementCollection(targetClass = Role.class, fetch=FetchType.EAGER)
        @Enumerated(EnumType.STRING) // Possibly optional (I'm not sure) but defaults to ORDINAL.
        @CollectionTable(name="person_roles")
        @Column(name="role") 
    public Set<Role> getRoles()
    {
        return roles;
    }
 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...