サポートされているデータ型
前の 3 つのレベルで、Hibernate について少し理解できました。第二ラウンドの時間です。さて、私たちは同じことをより深く学び始めます。そして、Entity クラスのフィールドをデータベース内のテーブルの列にマッピングすることから始めます。
すでにご存知のとおり、Entity クラスのフィールドの列へのマッピングは@Columnアノテーションを使用して行われます。ここで問題は、どのようなタイプのフィールドをそのようなアノテーションでマッピングできるのかということです。
Java のすべてのデータ型は、次の 3 つのグループに分類できます。
- この型は非常に単純で、データベースに簡単に保存できます。
- この型は複雑なので、それ用の特別なコンバータを作成する必要があります。
- この型は非常に複雑なので、その値を保存するには別のテーブルが必要です。
Hibernate が保存方法を認識している単純な型は次のとおりです。
Javaの型 | パッケージ | クラスの例 |
---|---|---|
プリミティブ Java 型 | boolean、 int、 doubleなど。 | |
プリミティブに対するラッパー | java.lang | Boolean、 Integer、 Doubleなど。 |
文字列 | java.lang | 弦 |
「高度な」数値 | java.数学 | BigIntegerとBigDecimal |
日時 | 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 |
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 |
GO TO FULL VERSION