サポートされているデータ型

前の 3 つのレベルで、Hibernate について少し理解できました。第二ラウンドの時間です。さて、私たちは同じことをより深く学び始めます。そして、Entity クラスのフィールドをデータベース内のテーブルの列にマッピングすることから始めます。

すでにご存知のとおり、Entity クラスのフィールドの列へのマッピングは@Columnアノテーションを使用して行われます。ここで問題は、どのようなタイプのフィールドをそのようなアノテーションでマッピングできるのかということです。

Java のすべてのデータ型は、次の 3 つのグループに分類できます。

  • この型は非常に単純で、データベースに簡単に保存できます
  • この型は複雑なので、それ用の特別なコンバータを作成する必要があります。
  • この型は非常に複雑なので、その値を保存するには別のテーブルが必要です

Hibernate が保存方法を認識している単純な型は次のとおりです。

Javaの型 パッケージ クラスの例
プリミティブ Java 型 boolean int doubleなど。
プリミティブに対するラッパー java.lang Boolean Integer Doubleなど。
文字列 java.lang
「高度な」数値 java.数学 BigIntegerBigDecimal
日時 java.time LocalDate LocalTime LocalDateTime OffsetTime OffsetDateTime Instant
さまざまな日付と時刻のバリエーション java.util 日付カレンダー
古い日付と時刻の形式 java.sql 日付時刻タイムスタンプ
バイトまたは文字の配列 byte[]またはByte[] char[]またはCharacter[]
列挙型 任意の列挙型
シリアル化可能なオブジェクト java.io.Serializable の実装

これらの型にはすべて SQL 言語の対応する型があるため、Hibernate はそれらをデータベースに保存したり、データベースからロードしたりする方法を知っています。

例:

@Entity
@Table(name="user")
class User
{
   @Column(name="id")
   public Integer id;

   @Column(name="name")
   public String name;

   @Column(name="level")
   public Integer level;

   @Column(name="created_date")
   public Date createdDate;
}

手動による型の割り当て - @Type アノテーション

場合によっては、Hibernate のポリシーを変更して、データベースにデータを保存するタイプを明示的に指定したい場合があります。たとえば、Entity クラスに Integer 型のフィールドがあるとしますが、ベースには VARCHAR 型の列があります。

この@Typeには特別な注釈があります。とてもシンプルに見えます:

@Type(type="type-name")

たとえば、Hibernate にフィールドを作成するように依頼してみましょう作成日Userクラスのは文字列としてデータベースに保存されました。

@Entity
@Table(name="user")
class User
{
   @Column(name="id")
    public Integer id;

   @Column(name="created_date")
   @Type(type="org.hibernate.type.StringType")
    public Date createdDate;
}

Hibernate が Date 型を新しい型に変換する方法を見つけたら、それを実行します。理解できない場合は、特別な型コンバータを指定する必要があります。しかし、それについては後で詳しく説明します。

データベースの Hibernate タイプのリスト

ところで、Stringではなくorg.hibernate.type.StringType型を指定していることに気づきましたか。これは、Java 言語ではなく DBMS によってサポートされるタイプの 1 つを選択したためです。それぞれに独自の型システムがあります。Hibernate 開発者がこれらの VARCHAR の代わりに便利な Java スタイルの名前を考え出しただけです。

ちなみに、このリストはそれほど小さいものではありません。ここでその一部を紹介します。

Hibernate タイプ (org.hibernate.type パッケージ) JDBCタイプ Java タイプ BasicTypeRegistry キー
文字列型 VARCHAR java.lang.string 文字列、java.lang.string
実体化した塊 クロブ java.lang.string 実体化されたクロブ
テキストタイプ LONGVARCHAR java.lang.string 文章
文字タイプ チャー char、java.lang.Character char、java.lang.Character
ブール型 少し ブール値、java.lang.Boolean ブール値、java.lang.Boolean
数値ブール型 INTEGER、0 は false、1 は true ブール値、java.lang.Boolean 数値ブール値
はいいいえタイプ CHAR、「N」/「n」は false、「Y」/「y」は true。大文字の値がデータベースに書き込まれます。 ブール値、java.lang.Boolean はい・いいえ
TrueFalseType CHAR、「F」/「f」は false、「T」/「t」は true。大文字の値がデータベースに書き込まれます。 ブール値、java.lang.Boolean 真/偽
バイトタイプ タイイント バイト、java.lang.Byte バイト、java.lang.Byte
ショートタイプ スモールント 短い、java.lang.Short 短い、java.lang.Short
整数型 整数 int、java.lang.Integer int、java.lang.Integer
ロングタイプ BIGINT 長い、java.lang.Long 長い、java.lang.Long
フロート型 浮く フロート、java.lang.Float フロート、java.lang.Float
ダブルタイプ ダブル ダブル、java.lang.Double ダブル、java.lang.Double
BigIntegerType 数値 java.math.BigInteger big_integer、java.math.BigInteger
BigDecimalType 数値 java.math.BigDecimal big_decimal、java.math.bigDecimal
タイムスタンプの種類 タイムスタンプ java.sql.タイムスタンプ タイムスタンプ、java.sql.timestamp
時間の種類 時間 java.sql.Time 時間、java.sql.Time
日付型 日にち java.sql.date 日付、java.sql.date
カレンダーの種類 タイムスタンプ java.util.Calendar カレンダー、java.util.Calendar
カレンダー日付タイプ 日にち java.util.Calendar カレンダーの日付
通貨の種類 java.util.通貨 VARCHAR 通貨、java.util.Currency
ロケールタイプ VARCHAR java.util.locale ロケール、java.utility.locale
タイムゾーンタイプ VARCHAR、TimeZone ID を使用 java.util.TimeZone タイムゾーン、java.util.TimeZone
URLタイプ VARCHAR java.net.URL URL、java.net.URL
クラスタイプ VARCHAR(クラスFQN) java.lang.クラス クラス、java.lang.Class

テーブルはもちろん大きいですが、とても便利です。たとえば、このことから、ブール型は少なくとも 6 つの異なる方法でデータベースに格納できることが明らかです。そんなに要らないの?そして、あなたが救う方法を選ぶなんて誰が言いましたか?

SQL にはブール型は存在せず、多くの場合次のように格納されます。

  • 1 または 0
  • 「F」または「T」
  • 「Y」または「N」

したがって、Hibernate がこれらすべての問題を理解できるのは非常に良いことです。あるいは、たとえば、データベース内のデータ配列のストレージを考えてみましょう。さまざまなオプションがたくさんあり、Hibernate はそれらすべてを操作する方法を知っています。

Hibernate タイプ (org.hibernate.type パッケージ) JDBCタイプ Java タイプ BasicTypeRegistr
ブロブタイプ BLOB java.sql.blob ブログ、java.sql.blob
クロブタイプ クロブ java.sql.clob clob、java.sql.clob
バイナリタイプ ヴァービナリー バイト[] バイナリ、バイト[]
実体化されたBlobType BLOB バイト[] materized_blob
画像タイプ ロングバーバイナリ バイト[] 画像
ラッパーバイナリタイプ ヴァービナリー java.lang.Byte[] ラッパーバイナリ、Byte[]、java.lang.Byte[]
文字配列タイプ VARCHAR 文字[] 文字、char[]
文字配列タイプ VARCHAR java.lang.Character[] ラッパー文字、Character[]、java.lang.Character[]
UUIDBinaryType バイナリ java.util.UUID uuid-binary、java.util.UUID
UUIDCharType CHAR、VARCHAR も読み取ることができます java.util.UUID uuid-char
PostgreSQLUUIDタイプ PostgreSQL JDBC ドライバー定義に準拠する PostgreSQL UUID (Types#OTHER 経由) java.util.UUID pg-uuid
JDK 8 のリリース以来、Hibernate にはさらにいくつかの時間関連の型が追加されました。すべてはあなたの生活を楽にするためです。これらの新しいタイプがすべてサポートされているかどうかを疑問に思う必要はもうありません。Hibernate の作成者はすでにサポートを追加しています。
Hibernate タイプ (org.hibernate.type パッケージ) JDBCタイプ Java タイプ BasicTypeRegistr
期間タイプ BIGINT java.time.Duration 期間、java.time.Duration
インスタントタイプ タイムスタンプ java.time.Instant インスタント、java.time.Instant
LocalDateTimeType タイムスタンプ java.time.LocalDateTime LocalDateTime、java.time.LocalDateTime
LocalDateType 日にち java.time.LocalDate LocalDate、java.time.LocalDate
LocalTimeType 時間 java.time.LocalTime LocalTime、java.time.LocalTime
OffsetDateTimeType タイムスタンプ java.time.OffsetDateTime OffsetDateTime、java.time.OffsetDateTime
OffsetTimeType 時間 java.time.OffsetTime オフセット時間、java.time.OffsetTime
OffsetTimeType タイムスタンプ java.time.ZonedDateTime ZonedDateTime、java.time.ZonedDateTime