6.1 Fayllarni serverda saqlash
Ba'zan ma'lumotlar bazasida binar obyektlarni saqlash kerak bo'ladi. Masalan, fayllar. Agar fayl katta bo'lsa, uni diskdagi alohida papkada saqlash, va ma'lumotlar bazasida uning yo'lini saqlash oqilona bo'ladi. Misol:
c:\db-files\users\12355\avatar.jpg
Va ma'lumotlar bazasida biz faqat faylga nisbatan yo'lni saqlaymiz:
\12355\avatar.jpg
Ma'lumotlar bazasida nisbatan yo'lni saqlash qulay, chunki undan keyin URL ni olish oson:
https://storage.javarush.ru/users/12355/avatar.jpg
Biz shunchaki nisbatan yo'lni server nomiga ulaymiz va tayyor.
6.2 Rasmlarni to'g'ridan-to'g'ri bazada saqlash
Biroq, agar rasmlar kichik bo'lsa, ularni to'g'ridan-to'g'ri bazada saqlash va mijozga baytlar to'plami sifatida berish mumkin. Bunday hollarda SQLda maxsus ma'lumot turi mavjud – BLOB – Binary Large Object. Aniqrog'i, ular hatto ikkita:
- CLOB – Character Large Object,
- BLOB – Binary Large Object.
CLOB juda katta matnlarni saqlash uchun ishlatiladi. BLOB esa kichik rasmlar, video va shunga o'xshash binar ma'lumotlarni saqlash uchun ishlatiladi.
Misol:
@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;
// ...
}
Annotatsiya @Lob Hibernatega, bu maydonda Large Object saqlanishini bildiradi. A columnDefinition="BLOB" esa uni qanday qilib bazada saqlashni bildiradi.
Keling yangi foydalanuvchini va uning fotosuratini bazaga saqlaydigan kod yozamiz:
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 va JSON
Hibernate JSONni ma'lumot tur sifatida qiziqarli qo'llab-quvvatlaydi. U HashMap qatorlarini yagona JSON obyekt sifatida saqlash imkonini beradi. Agar SUBD JSON bilan ishlay olsa, u quyidagicha ko'rinadi:
@JdbcTypeCode(SqlTypes.JSON)
private Map<String, String> properties;
Hibernate Map<String, String> obyektini yagona JSON obyektga seriyalashtirishni o'z zimmasiga oladi. Baza obyektini o'qiyotganda ham JSON obyektni Map<String, String> to'plamiga aylantiradi.
Shunga o'xshash narsani Hibernate XML bilan ham qilishi mumkin:
@JdbcTypeCode(SqlTypes.SQLXML)
private Map<String, String> properties;
GO TO FULL VERSION