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 พิเศษ - Binary Large Object หรือค่อนข้างมีสองอย่าง:

  • 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

ไฮเบอร์เนตมีการสนับสนุน JSON เป็นประเภทข้อมูลที่น่าสนใจ ช่วยให้คุณจัดเก็บ HashMap ของสตริงเป็นวัตถุ JSON เดียว หาก DBMS สามารถทำงานร่วมกับ JSON ได้ จะมีลักษณะดังนี้:

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

ไฮเบอร์เนตดูแลว่าออบเจกต์ประเภทนั้นMap<String, String>ถูกทำให้เป็นอนุกรมเป็นออบเจกต์ JSON เดียว นอกจากนี้ เมื่ออ่านวัตถุจากฐานข้อมูล มันจะเปลี่ยนวัตถุ JSON ให้เป็นชุดของMap<String, String>.

ไฮเบอร์เนตสามารถทำสิ่งที่คล้ายกันกับ XML:

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