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数据类型——二进制大对象。或者更确切地说,甚至有两个:

  • 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;