Dillo hbm2ddl di Hibernate per aggiungere MySQL colonne enum per i campi @Enumerated annotati

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

Domanda

Sto creando una tabella di DB usando hbm2ddl con codice Java simile al seguente:

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

Funziona bene, ma per "tipo" si crea una colonna VARCHAR, vale a dire gli sguardi di codice DDL come questo:

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

Ma quello che voglio avere è questa:

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

È possibile dichiarare in Hibernate, preferito con annotazioni?

O c'è un modo per estendere SchemaUpdate e sovrascrivere il metodo che rende la parte di script alter per il campo enumerato il modo in cui mi piace?

Sfondo:. Lo stesso database è usato in una parte del progetto PHP e voglio evitare che i valori non validi vengono inseriti

È stato utile?

Soluzione

Io credo che sta per essere complicato, dal momento che i java.sql.Types, che definiscono i tipi SQL trattati da Java, non ha tipo enum (dato che non è un tipo standardizzato secondo SQL-92).

Se questo è stata il caso si potrebbe creare un UserType Hibernate personalizzato estendendo l'EnumType e l'impostazione del SQLTYPE di conseguenza, ma dal momento che java.sql.Types non gestisce Non mi vedere come utilizzare nativo enum sql.

Con i migliori saluti!

Altri suggerimenti

Anche se sembra non v'è alcun modo per gestire MySQL enumerazioni automaticamente al 100%, come fuori punte da Lucas per la sua risposta, v'è in realtà un modo semplice per contorno esso. È possibile utilizzare l'attributo columnDefinition su annotazioni @Column, che sembra essere specificamente progettato per generare il codice DDL personalizzato.

Si veda l'estratto documentazione che descrive l'attributo:

(opzionale) Il frammento SQL che viene utilizzato durante la generazione del DDL per la colonna.

predefiniti allo SQL generato per creare una colonna del tipo derivato.

La restrizione NOT NULL è abbastanza standard, ed è supportato da un altro nullable attributo.

In questo modo, la vostra definizione di proprietà sarebbe simile a questa:

@Enumerated(EnumType.STRING)
@Column(columnDefinition = "enum ('TypeA', 'TypeB')", nullable = false)
private Type type;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top