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