2009-12-01 6 views
2

La définition suivante de la colonne JPA génère un type de données « entier » par défaut sur toutes les bases de données (par exemple, h2, mysql, postgres)hbm2ddl sur une colonne basée sur GenericEnumUserType

@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; 

Je voudrais utiliser le stockage minimal pour Ce champ préfèrerait donc utiliser le paramètre columnDefinition pour la génération de schema2ddl. Mais ressemble à tinyint n'est pas supporté dans postgres, mais est pris en charge 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 minimum de stockage) pouvant être utilisé à cette fin? Serait-ce smallint?

Répondre

2

Étant donné que vous utilisez un type personnalisé (pourquoi?), Les définitions de colonne sous-jacentes seront 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 de Dialect approprié.

Ainsi, si sqlTypes() devaient retourner new int[] {Types.TINYINT}, dialecte PostgresQL serait la carte à int2 et H2/MySQL pour tinyint.

Tout ce que dit, je généralement recommander à:

  1. Utilisation built-in enum support via l'annotation @Enumerated.
  2. Stocke la valeur enum comme chaîne plutôt qu'entier. L'utilisation de ce dernier économise de l'espace, mais introduit un énorme problème potentiel: 3 mois (années) plus tard, quelqu'un change le code en insérant une autre constante enum au milieu de votre type et soudainement toutes vos données deviennent invalides. L'espace disque est bon marché; Traiter des problèmes comme celui-ci ne l'est pas.

    @Enumerated(EnumType.STRING) 
    @Column(name = "degree_type", nullable = false, length=!0) 
    private DegreeType type; 
    
+0

Merci et apprécie l'aide, ce qui rend le type comme TINYINT a fait l'affaire. En passant, je stocke les énumérations comme entiers et par conséquent cette abstraction est nécessaire en plus de GenericEnum. Puisque mes valeurs d'énumération sont localisables, je ne peux pas utiliser l'annotation @Enumerated qui stocke toutes les valeurs sous forme de chaînes – Joe

Questions connexes