Скажите HBM2DDL Hibernate, чтобы добавить столбцы MySQL Enum для @Enumerated Annoted Fields
Вопрос
Я создаю таблицу 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;