6.1 Съхранявайте файлове на сървъра
Понякога двоичните обекти трябва да бъдат записани в базата данни. Например файлове. Ако файлът е голям, тогава е най-разумно да го съхранявате в отделна папка на диска и да съхранявате пътищата му в базата данни. Пример:
c:\db-files\users\12355\avatar.jpg
И в базата данни съхраняваме само относителен път към file:
\12355\avatar.jpg
Удобно е да съхранявате относителен път в базата данни, тъй като след това е лесно да получите URL от него:
https://storage.codegym.cc/users/12355/avatar.jpg
Просто поставяме относителния път към името на сървъра и сме готови.
6.2 Съхранявайте изображения директно в базата данни
Въпреки това, ако снимките са малки, те могат да се съхраняват директно в базата данни и да се предоставят на клиента като набор от byteове. За такива случаи 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"
вече говори за това How да запазите всичко това в базата данни.
Нека напишем примерен code, който запазва нов потребител и неговата снимка в базата данни:
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 обект. Ако СУБД може да работи с 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;
GO TO FULL VERSION