6.1 ファイルをサーバーに保存する

場合によっては、バイナリ オブジェクトをデータベースに保存する必要があります。たとえば、ファイルです。ファイルが大きい場合は、ファイルをディスク上の別のフォルダーに保存し、そのパスをデータベースに保存するのが最も合理的です。例:

c:\db-files\users\12355\avatar.jpg

そしてデータベースにはファイルへの相対パスのみを保存します。

\12355\avatar.jpg

相対パスをデータベースに保存すると、そこから URL を簡単に取得できるため便利です。

https://storage.codegym.cc/users/12355/avatar.jpg

サーバー名への相対パスを貼り付けるだけで完了です。

6.2 画像をデータベースに直接保存する

ただし、画像が小さい場合は、データベースに直接保存し、バイトのセットとしてクライアントに渡すことができます。このような場合に備えて、SQL には特別なBLOBデータ型、つまりバイナリ ラージ オブジェクトが用意されています。というか、次の 2 つさえあります。

  • CLOB - 文字ラージ オブジェクト、
  • BLOB - バイナリ ラージ オブジェクト。

CLOB は、非常に大きなテキストを格納するために使用されます。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フィールドに格納されていることを Hibernate に伝えます。そして、それをすべてデータベースに保存する方法についてはすでに説明しています。columnDefinition="BLOB"

新しいユーザーとその写真をデータベースに保存するサンプルコードを書いてみましょう。

byte[] imageBuffer = Files.readAllBytes(Paths.get("C:/temp/avatar.png"))

User user = new User();
user.setId("1");
user.setName("Zapp");
user.setPhoto(imageBuffer);

session.persist(user);

6.3 XML と JSON

Hibernate は、データ型として JSON をサポートしています。文字列の HashMap を単一の JSON オブジェクトとして保存できます。DBMS が JSON を使用できる場合は、次のようになります。

@JdbcTypeCode(SqlTypes.JSON)
private Map<String, String> properties;

Hibernate は、型オブジェクトがMap<String, String>単一の JSON オブジェクトにシリアル化されるようにします。また、データベースからオブジェクトを読み取るときは、JSON オブジェクトを のセットに変換しますMap<String, String>

Hibernate は XML を使用して同様のことを行うことができます。

@JdbcTypeCode(SqlTypes.SQLXML)
private Map<String, String> properties;