6.1 Przechowuj pliki na serwerze

Czasami obiekty binarne muszą zostać zapisane w bazie danych. Na przykład pliki. Jeśli plik jest duży, najrozsądniej jest przechowywać go w osobnym folderze na dysku, a jego ścieżki przechowywać w bazie danych. Przykład:

c:\db-files\users\12355\avatar.jpg

A w bazie danych przechowujemy tylko względną ścieżkę do pliku:

\12355\avatar.jpg

Wygodnie jest przechowywać ścieżkę względną w bazie danych, ponieważ łatwo jest wtedy uzyskać z niej adres URL:

https://storage.codegym.cc/users/12355/avatar.jpg

Po prostu wklejamy ścieżkę względną do nazwy serwera i gotowe.

6.2 Przechowuj obrazy bezpośrednio w bazie danych

Jeśli jednak zdjęcia są małe, można je zapisać bezpośrednio w bazie danych i przekazać klientowi jako zestaw bajtów. W takich przypadkach SQL ma specjalny typ danych BLOB - Binary Large Object. A raczej jest ich nawet dwóch:

  • CLOB - Postać Dużego Obiektu,
  • BLOB — duży obiekt binarny.

CLOB służy do przechowywania bardzo dużych tekstów. Obiekt BLOB służy do przechowywania danych binarnych, takich jak małe obrazki, filmy i tym podobne.

Przykład:

@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;

	// ...
}

Adnotacja @Lobinformuje Hibernate, że w polu przechowywany jest duży obiekt . I columnDefinition="BLOB"już mówi o tym, jak zapisać to wszystko w bazie danych.

Napiszmy przykładowy kod, który zapisuje nowego użytkownika i jego zdjęcie do bazy danych:

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 i JSON

Hibernate ma interesujące wsparcie dla JSON jako typu danych. Pozwala zapisać HashMap łańcuchów znaków jako pojedynczy obiekt JSON. Jeśli DBMS może współpracować z JSON, wygląda to tak:

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

Hibernate dba o to, aby obiekt typu Map<String, String>był serializowany do pojedynczego obiektu JSON. Ponadto podczas odczytu obiektu z bazy danych zamienia obiekt JSON na zestaw plików Map<String, String>.

Hibernate może zrobić coś podobnego z XML:

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