hbm2ddl auf einer Säule basiert auf GenericEnumUserType
Frage
Die folgende JPA Spaltendefinition erzeugt einen "integer" Datentyp standardmäßig auf allen Datenbanken (z.B. 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;
Ich möchte für dieses Feld minimal Speicher verwenden und daher würde es vorziehen, die Column Parameter für schema2ddl Generation zu verwenden. Aber sieht aus wie Tinyint nicht in Postgres unterstützt wird, wird aber in anderen Datenbanken oben erwähnt unterstützt.
Wäre es möglich, verschiedene SQL-Dateien zu erzeugen, basierend auf dem Datenbanktyp. 1. Was wäre der beste Ansatz, dies zu acheive? 2. Was wäre der besten Datentyp (mit minimalem Speicher) sein, die für diesen Zweck verwendet werden können? Wäre das smallint werden
Lösung
Da Sie benutzerdefinierten Typen verwenden (warum?), Die zugrunde liegende Spaltendefinition (en) würde basierend auf Ergebnis Ihrer Art der sqlTypes()
Methode erzeugt werden. Der tatsächliche SQL-Spaltentyp würde aus entsprechendem Dialect
erhalten werden.
Wenn also sqlTypes()
new int[] {Types.TINYINT}
zurückzukehren, würde PostgresQL Dialekt wo es sich int2
und H2 / MySQL tinyint
.
Alles, was gesagt, ich würde im Allgemeinen empfehlen:
- Verwenden Sie Einbau-ENUM-Unterstützung über
@Enumerated
Anmerkung. -
Shop Enum-Wert als string , anstatt integer. letztere verwenden, funktioniert aber etwas Platz sparen, aber es stellt ein enormes Potenzial Problem: 3 Monate (Jahre) auf der ganzen Linie jemand den Code ändert sich durch eine andere Aufzählungskonstante in der Mitte des Typs eingesetzt und plötzlich alle Ihre Daten ungültig. Speicherplatz ist billig; mit Themen wie das zu tun ist es nicht.
@Enumerated(EnumType.STRING) @Column(name = "degree_type", nullable = false, length=!0) private DegreeType type;