GenericEnumUserTypeに基づく列のhbm2ddl
質問
次の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
へ。
とは言っても、一般的にをお勧めします:
- 組み込み列挙型サポートを使用
@Enumerated
アノテーション経由。 -
enum値を整数ではなく string として保存します。後者を使用するとスペースを節約できますが、大きな潜在的な問題が発生します:3か月(年)後に、誰かが型の途中に別の列挙定数を挿入することでコードを変更し、突然すべてのデータが無効になります。ディスク容量は安価です。そのような問題への対処はそうではありません。
@Enumerated(EnumType.STRING) @Column(name = "degree_type", nullable = false, length=!0) private DegreeType type;
所属していません StackOverflow