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;