Dígale a HBM2DDL de Hibernate que agregue columnas MySQL enum para campos anotados @Enumerated

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

Pregunta

Estoy creando una tabla DB usando HBM2DDL con código Java similar al siguiente:

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

Funciona bien, pero para "escribir" se crea una columna Varchar, es decir, el código DDL se ve así:

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

Pero lo que quiero tener es esto:

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

¿Es esto posible declarar en hibernado, preferido con anotaciones?

¿O hay alguna manera de extender el esquemaupdate y sobrescribir el método que representa la parte de script alter para el campo enumerado de la manera que me gusta?

Antecedentes: la misma base de datos se utiliza en una parte de PHP del proyecto y quiero evitar que se inserten los valores no válidos.

¿Fue útil?

Solución

Creo que eso será complicado, ya que el Java.SQL.Types, que definen los tipos SQL tratados por Java, no tiene el tipo enum (ya que no es un tipo estandarizado según SQL-92).

Si eso estaba El caso de que pueda crear un UserType personalizado Hibernate que extienda el EnumType y establecer el SQLType en consecuencia, pero dado que Java.sql.Types no lo maneja, no veo cómo usar SQL enum nativo.

¡saludos!

Otros consejos

Aunque parece que no hay forma de manejar MySQL enums 100% automáticamente, como lo señaló Lucas en su respuesta, en realidad hay una manera simple de contornearlo. Puedes utilizar columnDefinition atribuir @Column Anotación, que parece estar específicamente diseñada para generar código DDL personalizado.

Consulte el extracto de documentación que describe el atributo:

(Opcional) El fragmento SQL que se usa al generar el DDL para la columna.

El valor predeterminado al SQL generado para crear una columna del tipo inferido.

los NOT NULL La restricción es bastante estándar y es compatible con otro atributo nullable.

Por lo tanto, la definición de su propiedad se vería así:

@Enumerated(EnumType.STRING)
@Column(columnDefinition = "enum ('TypeA', 'TypeB')", nullable = false)
private Type type;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top