6.1 Fájlok tárolása a szerveren

Néha bináris objektumokat kell menteni az adatbázisba. Például fájlok. Ha a fájl nagy, akkor a legésszerűbb egy külön mappában tárolni a lemezen, és az elérési útjait az adatbázisban tárolni. Példa:

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

És az adatbázisban csak egy relatív elérési utat tárolunk a fájlhoz:

\12355\avatar.jpg

Kényelmes relatív elérési utat tárolni az adatbázisban, mivel így könnyen lekérhető belőle egy URL:

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

Csak beillesztjük a relatív elérési utat a szerver nevéhez, és kész is vagyunk.

6.2 Képek tárolása közvetlenül az adatbázisban

Ha azonban a képek kicsik, akkor közvetlenül az adatbázisban tárolhatók, és bájtkészletként adhatók át a kliensnek. Az ilyen esetekre az SQL-nek van egy speciális BLOB adattípusa - Binary Large Object. Vagy inkább kettő van belőlük:

  • CLOB – Character Large Object,
  • BLOB – Bináris nagy objektum.

A CLOB nagyon nagy szövegek tárolására szolgál. A BLOB bináris adatok, például kis képek, videók és hasonlók tárolására szolgál.

Példa:

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

	// ...
}

A megjegyzés @Lobjelzi a Hibernate-nak, hogy egy nagy objektum van a mezőben tárolva . És columnDefinition="BLOB"már beszél arról, hogyan lehet mindezt elmenteni az adatbázisba.

Írjunk egy példakódot, amely egy új felhasználót és fényképét menti az adatbázisba:

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 és JSON

A Hibernate érdekes módon támogatja a JSON-t adattípusként. Lehetővé teszi a karakterláncokból álló HashMap tárolását egyetlen JSON-objektumként. Ha a DBMS képes együttműködni a JSON-nal, akkor ez így néz ki:

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

A hibernálás gondoskodik arról, hogy a típusobjektum Map<String, String>egyetlen JSON-objektummá legyen szerializálva. Továbbá, amikor egy objektumot beolvas az adatbázisból, a JSON-objektumot készletté alakítja Map<String, String>.

A Hibernate valami hasonlót tud csinálni az XML-lel:

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