Dillo hbm2ddl di Hibernate per aggiungere MySQL colonne enum per i campi @Enumerated annotati
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
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 ??strong> 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;