Скажите hbm2ddl Hibernate добавить столбцы перечисления MySQL для аннотированных полей @Enumerated - PullRequest
4 голосов
/ 29 апреля 2011

Я создаю таблицу БД с использованием hbm2ddl с кодом Java, подобным следующему:

@Entity
public  class Filter {
    public enum Type {
        TypeA, TypeB;
    }
    @Enumerated(EnumType.STRING)
    private Type type;
}

Работает нормально, но для "типа" создается столбец VARCHAR, т. Е. Код DDL выглядит следующим образом:

CREATE TABLE IF NOT EXISTS `filter` (`type` varchar(255) DEFAULT NULL)

Но то, что я хочу иметь, это:

CREATE TABLE IF NOT EXISTS `filter` (`type` enum('TypeA','TypeB') NOT NULL)

Можно ли это объявить в Hibernate, предпочтительнее с аннотациями?

Или есть способ расширить SchemaUpdate и перезаписать метод, который визуализирует часть сценария alter для перечисляемого поля, как мне нравится?

Справочная информация: та же база данных используется в части проекта PHP, и я хочу предотвратить вставку недопустимых значений.

Ответы [ 2 ]

1 голос
/ 15 января 2014

Хотя кажется, что нет способа обрабатывать перечисления MySQL на 100% автоматически, как указал Лукас в своем ответе, на самом деле существует простой способ обрисовать его контуры.Вы можете использовать атрибут columnDefinition в аннотации @Column, которая, как представляется, специально предназначена для создания пользовательского кода DDL.

См. Отрывок документации, описывающий атрибут:

(Необязательно)) Фрагмент SQL, который используется при создании DDL для столбца.

По умолчанию используется сгенерированный SQL для создания столбца выведенного типа.

Ограничение NOT NULLвполне стандартно и поддерживается другим атрибутом nullable.

Таким образом, определение вашего свойства будет выглядеть так:

@Enumerated(EnumType.STRING)
@Column(columnDefinition = "enum ('TypeA', 'TypeB')", nullable = false)
private Type type;
0 голосов
/ 29 апреля 2011

Я полагаю, что это будет сложно, поскольку java.sql.Types, которые определяют типы sql, обрабатываемые java, не имеют тип enum (так как это не стандартизированный тип в соответствии с SQL-92).

Если это было , то вы можете создать спящий пользовательский тип UserType, расширяющий EnumType и соответственно устанавливающий sqlType, но, поскольку java.sql.Types не обрабатывает его, я не вижу, как его использовать. родной sql enum.

С наилучшими пожеланиями!

...