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;
GO TO FULL VERSION