Скажите HBM2DDL Hibernate, чтобы добавить столбцы MySQL Enum для @Enumerated Annoted Fields

StackOverflow https://stackoverflow.com/questions/5835501

Вопрос

Я создаю таблицу DB, используя 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 и перезаписать метод, который делает альтернативную часть сценария для перечисленного поля таким, как мне это нравится?

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

Это было полезно?

Решение

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

Если это был Случай вы можете создать пользовательский Hibernate UserType, расширяющий перечисление и настройка SQLTYPE соответственно, но, поскольку java.sql.types не обрабатывает его, я не вижу, как использовать Native SQL Enum.

с уважением!

Другие советы

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

См. Выдержка документации с описанием атрибута:

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

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

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

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

@Enumerated(EnumType.STRING)
@Column(columnDefinition = "enum ('TypeA', 'TypeB')", nullable = false)
private Type type;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top