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;