Question

La définition de colonne JPA suivante génère un " entier " type de données par défaut sur toutes les bases de données (par exemple, h2, mysql, postgres)

@Column(name = "type", nullable = false)
@Type(type = "com.mycompany.hibernate.usertype.GenericEnumUserType", parameters = {
        @Parameter(name = "enumClass", value = "com.mycompany.model.DegreeType"),
        @Parameter(name = "identifierMethod", value = "toInt"),
        @Parameter(name = "valueOfMethod", value = "fromInt") })
@NotNull
private DegreeType type;

J'aimerais utiliser un stockage minimal pour ce champ et préférerais donc utiliser le paramètre columnDefinition pour la génération schema2ddl. Mais on dirait que tinyint n’est pas supporté dans postgres, mais dans d’autres bases de données mentionnées ci-dessus.

Serait-il possible de générer différents fichiers SQL en fonction du type de base de données. 1. Quelle serait la meilleure approche pour y parvenir? 2. Quel serait le meilleur type de données (avec un stockage minimal) pouvant être utilisé à cette fin? Serait-ce smallint

Était-ce utile?

La solution

Puisque vous utilisez un type personnalisé (pourquoi?), la ou les définitions de colonne sous-jacentes seraient générées en fonction du résultat de la méthode sqlTypes () de votre type. Le type de colonne SQL réel serait obtenu à partir du Dialect approprié.

Ainsi, si sqlTypes () devait renvoyer new int [] {Types.TINYINT} , le dialecte PostgresQL le mapperait sur int2 et H2 / MySQL vers tinyint .

Cela dit, je recommanderai de manière générale:

  1. Utilisez prise en charge de l'énum intégré via @Enumerated annotation.
  2. Stockez la valeur enum sous la forme chaîne plutôt que sous la forme d'un entier. Utiliser ce dernier permet de gagner de la place, mais cela pose un énorme problème: 3 mois (années) après, quelqu'un modifie le code en insérant une autre constante d'énum au milieu de votre type et toutes vos données deviennent soudainement invalides. L'espace disque est bon marché. traiter de tels problèmes n’est pas.

    @Enumerated(EnumType.STRING)
    @Column(name = "degree_type", nullable = false, length=!0)
    private DegreeType type;
    
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top