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

War es hilfreich?

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:

  1. Verwenden Sie Einbau-ENUM-Unterstützung über @Enumerated Anmerkung.
  2. 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;
    
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top