HibernateでのLOBデータのマッピング
1. 概要
LOBまたはLargeOBjectは、ラージオブジェクトを格納するための可変長データ型を指します。
データ型には2つのバリアントがあります。
- CLOB –文字ラージオブジェクトはラージテキストデータを格納します
- BLOB – バイナリラージオブジェクトは、画像、音声、ビデオなどのバイナリデータを保存するためのものです
このチュートリアルでは、大きなオブジェクトを永続化するためにHibernateORMを利用する方法を示します。
2. 設定
たとえば、Hibernate5とH2データベースを使用します。 したがって、 pom.xml:で依存関係として宣言する必要があります。
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.12.Final</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.196</version>
</dependency>
依存関係の最新バージョンは、 Maven CentralRepositoriesにあります。
Hibernateの構成の詳細については、入門の記事の1つを参照してください。
3. LOBデータモデル
モデル「ユーザー」には、プロパティとしてID、名前、写真があります。 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 アノテーションは、データベースがプロパティを LargeObjectとして格納する必要があることを指定します。 @ColumnアノテーションのcolumnDefinitionは、プロパティの列タイプを定義します。
バイト配列を保存するため、BLOBを使用しています。
4. 使用法
4.1. Hibernateセッションを開始します
session = HibernateSessionUtil
.getSessionFactory("hibernate.properties")
.openSession();
ヘルパークラスを使用して、hibernate.propertiesファイルで提供されるデータベース情報を使用してHibernateセッションを構築します。
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 は、ラージオブジェクトデータを格納するためのデータ型です。 LOB には、BLOBとCLOBという2種類があります。 BLOB はバイナリデータを格納するためのものであり、CLOBはテキストデータを格納するためのものです。
Hibernate を使用して、正しいデータモデルと適切なテーブル構造を定義している限り、Javaオブジェクトとの間でデータをマッピングするのが非常に簡単であることを示しました。データベース内。
いつものように、この記事のコードはGitHubで入手できます。