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 @Lob
informuje 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;
GO TO FULL VERSION