6.1 Lưu trữ tệp trên máy chủ

Đôi khi các đối tượng nhị phân cần được lưu vào cơ sở dữ liệu. Ví dụ: các tệp . Nếu tệp lớn, thì hợp lý nhất là lưu trữ nó trong một thư mục riêng trên đĩa và lưu các đường dẫn của nó trong cơ sở dữ liệu. Ví dụ:

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

Và trong cơ sở dữ liệu, chúng tôi chỉ lưu trữ một đường dẫn tương đối đến tệp:

\12355\avatar.jpg

Thật tiện lợi khi lưu trữ một đường dẫn tương đối trong cơ sở dữ liệu, vì khi đó rất dễ lấy một URL từ nó:

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

Chúng tôi chỉ cần dán đường dẫn tương đối vào tên máy chủ và chúng tôi đã hoàn tất.

6.2 Lưu trữ hình ảnh trực tiếp trong cơ sở dữ liệu

Tuy nhiên, nếu ảnh nhỏ, chúng có thể được lưu trữ trực tiếp trong cơ sở dữ liệu và cung cấp cho máy khách dưới dạng một tập hợp byte. Đối với những trường hợp như vậy, SQL có kiểu dữ liệu BLOB đặc biệt - Đối tượng lớn nhị phân. Hay đúng hơn, thậm chí có hai trong số chúng:

  • CLOB - Đối tượng nhân vật lớn,
  • BLOB - Đối tượng lớn nhị phân.

CLOB được sử dụng để lưu trữ các văn bản rất lớn. BLOB dùng để lưu trữ dữ liệu nhị phân, chẳng hạn như ảnh nhỏ, video và những thứ tương tự.

Ví dụ:

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

	// ...
}

Chú thích @Lobcho Hibernate biết rằng một Đối tượng Lớn được lưu trữ trong trường . Và columnDefinition="BLOB"đã nói về cách lưu tất cả vào cơ sở dữ liệu.

Hãy viết một mã ví dụ lưu người dùng mới và ảnh của anh ấy vào cơ sở dữ liệu:

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 và JSON

Hibernate có hỗ trợ thú vị cho JSON dưới dạng kiểu dữ liệu. Nó cho phép bạn lưu trữ HashMap của các chuỗi dưới dạng một đối tượng JSON. Nếu DBMS có thể hoạt động với JSON, thì nó trông như thế này:

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

Hibernate đảm bảo rằng đối tượng loại Map<String, String>được tuần tự hóa thành một đối tượng JSON duy nhất. Ngoài ra, khi đọc một đối tượng từ cơ sở dữ liệu, nó sẽ biến đối tượng JSON thành một tập hợp các tệp Map<String, String>.

Hibernate có thể làm điều gì đó tương tự với XML:

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