6.1 Stocați fișiere pe server

Uneori, obiectele binare trebuie să fie salvate în baza de date. De exemplu, fișiere. Dacă fișierul este mare, atunci este cel mai rezonabil să îl stocați într-un folder separat de pe disc și să-i stocați căile în baza de date. Exemplu:

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

Și în baza de date stocăm doar o cale relativă către fișier:

\12355\avatar.jpg

Este convenabil să stocați o cale relativă în baza de date, deoarece este ușor să obțineți o adresă URL de la aceasta:

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

Pur și simplu lipim calea relativă la numele serverului și am terminat.

6.2 Stocați imaginile direct în baza de date

Cu toate acestea, dacă imaginile sunt mici, ele pot fi stocate direct în baza de date și date clientului ca un set de octeți. Pentru astfel de cazuri, SQL are un tip de date BLOB special - Binary Large Object. Sau, mai degrabă, sunt chiar două dintre ele:

  • CLOB - obiect mare caracter,
  • BLOB - Obiect mare binar.

CLOB este folosit pentru a stoca texte foarte mari. Un BLOB este pentru stocarea datelor binare, cum ar fi imagini mici, videoclipuri și altele asemenea.

Exemplu:

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

	// ...
}

Adnotarea @Lobîi spune lui Hibernate că un obiect mare este stocat în câmp . Și columnDefinition="BLOB"deja vorbește despre cum să salvez totul în baza de date.

Să scriem un exemplu de cod care salvează un utilizator nou și fotografia lui în baza de date:

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 are suport interesant pentru JSON ca tip de date. Vă permite să stocați un HashMap de șiruri de caractere ca un singur obiect JSON. Dacă DBMS poate funcționa cu JSON, atunci arată astfel:

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

Hibernate are grijă ca obiectul tip Map<String, String>să fie serializat într-un singur obiect JSON. De asemenea, atunci când citește un obiect din baza de date, acesta transformă obiectul JSON într-un set de Map<String, String>.

Hibernate poate face ceva similar cu XML:

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