2

次の JPA 列定義は、すべてのデータベース (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;

このフィールドには最小限のストレージを使用したいので、schema2ddl の生成には columnDefinition パラメーターを使用したいと考えています。しかし、tinyint は postgres ではサポートされていないようですが、上記の他のデータベースではサポートされています。

データベースの種類に基づいて異なる SQL ファイルを生成することは可能でしょうか。1.これを達成するための最良のアプローチは何ですか? 2. この目的に使用できる (最小限のストレージで) 最適なデータ型は何ですか? それはsmallintでしょうか

4

1 に答える 1

2

カスタム型を使用しているため (なぜですか?)、基になる列定義は型のsqlTypes()メソッドの結果に基づいて生成されます。実際の SQL 列の型は、適切な から取得されますDialect

したがって、sqlTypes()が返された場合new int[] {Types.TINYINT}、PostgresQL ダイアレクトはそれを にマップしint2、H2/MySQL を にマップしますtinyint

とはいえ、私は一般的に次のことをお勧めします。

  1. 注釈を介して組み込みの列挙型サポートを使用します。@Enumerated
  2. 列挙値を整数ではなく文字列として保存します。後者を使用するとスペースがいくらか節約されますが、潜在的な大きな問題が発生します。3 か月 (年) 後、誰かが型の途中に別の列挙型定数を挿入してコードを変更すると、突然すべてのデータが無効になります。ディスク容量は安価です。そのような問題を扱うことはそうではありません。

    @Enumerated(EnumType.STRING)
    @Column(name = "degree_type", nullable = false, length=!0)
    private DegreeType type;
    
于 2009-12-01T17:58:29.257 に答える