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オブジェクトにマップし直し、挿入されたデータと比較します。
挿入されたUser ‘s 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は、ラージオブジェクトデータを格納するためのデータ型です。 BLOBとCLOBと呼ばれるLOBには2つの種類があります。 BLOBはバイナリデータを格納するためのものであり、CLOBはテキストデータを格納するためのものです。
Hibernateを使用して、データベースで正しいデータモデルと適切なテーブル構造を定義している限り、Javaオブジェクトとの間でデータをマッピングするのが非常に簡単であることを示しました。
いつものように、この記事のコードは利用可能ですover on GitHub.