質問

次の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.この目的に使用できる最適なデータタイプ(最小ストレージ)は何ですか?それは小さくなりますか

役に立ちましたか?

解決

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

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

とは言っても、一般的にをお勧めします:

  1. 組み込み列挙型サポートを使用 @Enumerated アノテーション経由。
  2. enum値を整数ではなく string として保存します。後者を使用するとスペースを節約できますが、大きな潜在的な問題が発生します:3か月(年)後に、誰かが型の途中に別の列挙定数を挿入することでコードを変更し、突然すべてのデータが無効になります。ディスク容量は安価です。そのような問題への対処はそうではありません。

    @Enumerated(EnumType.STRING)
    @Column(name = "degree_type", nullable = false, length=!0)
    private DegreeType type;
    
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top