HibernateでのLOBデータのマッピング

HibernateでのLOBデータのマッピング

1. 概要

LOBまたはラージOBjectは、ラージオブジェクトを格納するための可変長データ型を指します。

データ型には2つのバリアントがあります。

  • CLOB –Character Large Objectは大きなテキストデータを格納します

  • BLOB –Binary Large Objectは、画像、音声、ビデオなどのバイナリデータを保存するためのものです

このチュートリアルでは、HibernateORMを利用して大きなオブジェクトを永続化する方法を示します。

2. セットアップ

たとえば、Hibernate5とH2データベースを使用します。 したがって、pom.xml:で依存関係として宣言する必要があります


    org.hibernate
    hibernate-core
    5.2.12.Final


    com.h2database
    h2
    1.4.196

依存関係の最新バージョンはMaven Central Repositoriesにあります。

Hibernateの構成の詳細については、introductoryの記事の1つを参照してください。

3. LOBデータモデル

モデル“User”には、プロパティとしてid、name、photoがあります。 画像をUserのphotoプロパティに保存し、それをBLOBにマッピングします。

@Entity
@Table(name="user")
public class User {

    @Id
    private String id;

    @Column(name = "name", columnDefinition="VARCHAR(128)")
    private String name;

    @Lob
    @Column(name = "photo", columnDefinition="BLOB")
    private byte[] photo;

    // ...
}

@Lobアノテーションは、データベースがプロパティをLarge Objectとして格納する必要があることを指定します。 @ColumnアノテーションのcolumnDefinitionは、プロパティの列タイプを定義します。

byte arrayを保存するので、BLOB.を使用します

4. 使用法

4.1. Hibernateセッションを開始する

session = HibernateSessionUtil
  .getSessionFactory("hibernate.properties")
  .openSession();

ヘルパークラスを使用して、hibernate.propertiesファイルで提供されるデータベース情報を使用してHibernate Sessionを構築します。

4.2. ユーザーインスタンスの作成

ユーザーが写真を画像ファイルとしてアップロードするとします。

User user = new User();

InputStream inputStream = this.getClass()
  .getClassLoader()
  .getResourceAsStream("profile.png");

if(inputStream == null) {
    fail("Unable to get resources");
}
user.setId("1");
user.setName("User");
user.setPhoto(IOUtils.toByteArray(inputStream));

Apache Commons IOライブラリを使用して画像ファイルをバイト配列に変換し、最後に、新しく作成されたUserオブジェクトの一部としてバイト配列を割り当てます。

4.3. ラージオブジェクトの永続化

Sessionを使用してUserを格納することにより、Hibernateはオブジェクトをデータベースレコードに変換します。

session.persist(user);

クラスUserで宣言された@Lobアノテーションにより、Hibernateは、“photo”プロパティをBLOBデータ型として格納する必要があることを理解しています。

4.4. データ検証

データベースからデータを取得し、Hibernateを使用してデータをJavaオブジェクトにマップし直し、挿入されたデータと比較します。

挿入されたUsers idがわかっているので、それを使用してデータベースからデータを取得します。

User result = session.find(User.class, "1");

クエリの結果を入力Userのデータと比較してみましょう。

assertNotNull(
  "Query result is null",
  result);

assertEquals(
  "User's name is invalid",
  user.getName(), result.getName() );

assertTrue(
  "User's photo is corrupted",
  Arrays.equals(user.getPhoto(), result.getPhoto()) );

Hibernateは、注釈の同じマッピング情報を使用して、データベース内のデータをJavaオブジェクトにマッピングします。

したがって、取得されたUserオブジェクトには、挿入されたデータと同じ情報が含まれます。

5. 結論

LOBは、ラージオブジェクトデータを格納するためのデータ型です。 BLOBCLOBと呼ばれるLOBには2つの種類があります。 BLOBはバイナリデータを格納するためのものであり、CLOBはテキストデータを格納するためのものです。

Hibernateを使用して、データベースで正しいデータモデルと適切なテーブル構造を定義している限り、Javaオブジェクトとの間でデータをマッピングするのが非常に簡単であることを示しました。

いつものように、この記事のコードは利用可能ですover on GitHub.