Pregunta

La siguiente definición de columna JPA genera un "entero" tipo de datos por defecto en todas las bases de datos (por ejemplo, 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;

Me gustaría usar un almacenamiento mínimo para este campo y, por lo tanto, preferiría usar el parámetro columnDefinition para la generación de schema2ddl. Pero parece que tinyint no es compatible con postgres, pero es compatible con otras bases de datos mencionadas anteriormente.

¿Sería posible generar diferentes archivos SQL basados ??en el tipo de base de datos? 1. ¿Cuál sería el mejor enfoque para lograr esto? 2. ¿Cuál sería el mejor tipo de datos (con almacenamiento mínimo) que se puede utilizar para este propósito? ¿Sería una letra pequeña?

¿Fue útil?

Solución

Dado que está utilizando un tipo personalizado (¿por qué?), las definiciones de columna subyacentes se generarían en función del resultado del método sqlTypes () de su tipo. El tipo de columna SQL real se obtendría del Dialect apropiado.

Por lo tanto, si sqlTypes () devolviera new int [] {Types.TINYINT} , el dialecto PostgresQL lo asignaría a int2 y H2 / MySQL a tinyint .

Dicho todo esto, generalmente recomendaría:

  1. Use soporte de enumeración incorporado a través de la anotación @Enumerated .
  2. Almacene el valor de enumeración como cadena en lugar de entero. El uso de este último ahorra algo de espacio, pero presenta un gran problema potencial: 3 meses (años) más adelante, alguien cambia el código insertando otra constante enum en el medio de su tipo y de repente todos sus datos se vuelven inválidos. El espacio en disco es barato; lidiar con problemas como ese no lo es.

    @Enumerated(EnumType.STRING)
    @Column(name = "degree_type", nullable = false, length=!0)
    private DegreeType type;
    
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top