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 には、BLOBCLOBという2種類があります。 BLOB はバイナリデータを格納するためのものであり、CLOBはテキストデータを格納するためのものです。

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

いつものように、この記事のコードはGitHubで入手できます。