Sagen Sie Hibernate HBM2DDL, MySQL Enum -Spalten für @Enumerated kommentierte Felder hinzuzufügen
Frage
Ich erstelle eine DB -Tabelle mit HBM2DDL mit Java -Code ähnlich wie folgt:
@Entity
public class Filter {
public enum Type {
TypeA, TypeB;
}
@Enumerated(EnumType.STRING)
private Type type;
}
Es funktioniert gut, aber für "Typ" eine Varchar -Spalte wird erstellt, dh der DDL -Code sieht folgendermaßen aus:
CREATE TABLE IF NOT EXISTS `filter` (`type` varchar(255) DEFAULT NULL)
Aber was ich haben möchte, ist Folgendes:
CREATE TABLE IF NOT EXISTS `filter` (`type` enum('TypeA','TypeB') NOT NULL)
Ist dies möglich, in Ruhezustand zu deklarieren, bevorzugt mit Anmerkungen?
Oder gibt es eine Möglichkeit, Schemaupdate zu erweitern und die Methode zu überschreiben, die das Alterskriptteil für das aufzählige Feld so wie ich es mag?
Hintergrund: Die gleiche Datenbank wird in einem PHP -Teil des Projekts verwendet, und ich möchte verhindern, dass ungültige Werte eingefügt werden.
Lösung
Ich glaube, das wird kompliziert sein, da die von Java behandelten SQL-Typen, die die von Java behandelten SQL-Typen definieren, keinen Enum-Typ haben (da es sich nicht um einen standardisierten Typ nach SQL-92 handelt).
Wenn das war In dem Fall können Sie einen Hibernate -benutzerdefinierten Usertype erstellen, der den Enumtype erweitert und den SQLTYPE entsprechend festlegen kann. Da Java.sql.types jedoch nicht damit umgeht, sehe ich nicht, wie man native SQL Enum verwendet.
mit freundlichen Grüßen!
Andere Tipps
Obwohl es anscheinend keine Möglichkeit gibt, mit MySQL Enums zu 100% automatisch umzugehen, wie Lucas auf seine Antwort hervorgehoben hat, gibt es tatsächlich eine einfache Möglichkeit, es zu konturieren. Sie können verwenden columnDefinition
Attribut auf @Column
Annotation, die speziell für den Generieren benutzerdefinierter DDL -Code entwickelt zu sein scheint.
Siehe den Dokumentationsauszug, der das Attribut beschreibt:
(Optional) Das SQL -Fragment, das beim Erstellen der DDL für die Spalte verwendet wird.
Standardmäßig zum generierten SQL, um eine Spalte des abgeleiteten Typs zu erstellen.
Das NOT NULL
Die Einschränkung ist ziemlich Standard und wird durch ein anderes Attribut unterstützt nullable
.
So würde Ihre Eigenschaftsdefinition so aussehen:
@Enumerated(EnumType.STRING)
@Column(columnDefinition = "enum ('TypeA', 'TypeB')", nullable = false)
private Type type;