Dites-le hbm2ddl d'Hibernate pour ajouter MySQL colonnes ENUM pour les champs @Enumerated annotés

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

Question

Je crée une table DB en utilisant hbm2ddl avec le code Java similaire à ce qui suit:

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

Il fonctionne très bien, mais pour « type » une colonne VARCHAR est créée, à savoir le look de code DDL comme ceci:

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

Mais ce que je veux avoir est la suivante:

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

Est-ce possible de déclarer en veille prolongée, avec annotations préféré?

Ou est-il un moyen d'étendre SchemaUpdate et remplacer la méthode qui rend la partie de script alter pour le champ énuméré comme je l'aime?

Arrière-plan. La même base de données est utilisée dans une partie PHP du projet et je veux éviter que les valeurs non valides sont insérées

Était-ce utile?

La solution

Je crois que ça va être compliqué, puisque les java.sql.Types, qui définissent les types SQL traités par java, ne pas avoir de type ENUM (car ce n'est pas un type normalisé selon SQL-92).

Si ce n'a le cas, vous pouvez créer une UserType personnalisée mise en veille prolongée extension du EnumType et le réglage de la sqlType en conséquence, mais étant donné que java.sql.Types ne gère pas je ne vois pas comment utiliser ENUM sql natif.

meilleures salutations!

Autres conseils

Bien qu'il semble qu'il n'y ait aucun moyen de gérer MySQL énumérations 100% automatiquement, comme par Lucas sur pointe sur sa réponse, il est en fait un moyen simple pour le contour il. Vous pouvez utiliser l'attribut columnDefinition sur l'annotation de @Column, qui semble être conçu spécifiquement pour générer du code DDL personnalisé.

Voir l'extrait de la documentation décrivant l'attribut:

(Facultatif) Le fragment SQL qui est utilisé lors de la génération du DDL pour la colonne.

Par défaut, le SQL généré pour créer une colonne du type inféré.

La restriction NOT NULL est tout à fait standard, et est pris en charge par un autre nullable d'attribut.

Ainsi, la définition de votre propriété ressemblerait à ceci:

@Enumerated(EnumType.STRING)
@Column(columnDefinition = "enum ('TypeA', 'TypeB')", nullable = false)
private Type type;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top