hbm2ddl sobre uma coluna com base em GenericEnumUserType
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
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:
- suporte embutido enum via anotação
@Enumerated
. -
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;