Sagen Sie Hibernate HBM2DDL, MySQL Enum -Spalten für @Enumerated kommentierte Felder hinzuzufügen

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

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.

War es hilfreich?

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top