Pergunta

A seguinte definição coluna APP gera um "número inteiro" tipo de dados padrão em todos os bancos de dados (por exemplo, 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;

Eu gostaria de usar o mínimo de armazenamento para este campo e, portanto, prefere usar o parâmetro ColumnDefinition para a geração schema2ddl. Mas parece que tinyint não é suportado no postgres, mas é suportado em outros bancos de dados mencionados acima.

Seria possível gerar arquivos SQL diferentes com base no tipo de banco de dados. 1. Qual seria a melhor abordagem para conseguir isso? 2. Qual seria o melhor tipo de dados (com mínimo de armazenamento) que pode ser utilizado para este fim? Teria que ser smallint

Foi útil?

Solução

Uma vez que você estiver usando tipo personalizado (por quê?), A definição da coluna subjacente (s) seria gerada com base em resultado de método sqlTypes() do seu tipo. O tipo de coluna SQL real seria obtida a partir Dialect apropriada.

Assim, se sqlTypes() foram para retornar new int[] {Types.TINYINT}, PostgresQL dialeto que mapeá-lo para int2 e H2 / MySQL para tinyint.

Tudo o que disse, eu em geral recomendar a:

  1. suporte embutido enum via anotação @Enumerated.
  2. loja valor enum como string em vez de inteiro. Usando o último não conservar algum espaço, mas apresenta um problema enorme potencial: 3 meses (anos) para baixo da outra linha altera o código inserindo outra constante enum no meio do seu tipo e de repente todos os seus dados se torna inválida. O espaço em disco é barato; lidar com questões como essa não é.

    @Enumerated(EnumType.STRING)
    @Column(name = "degree_type", nullable = false, length=!0)
    private DegreeType type;
    
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top