6.1 Lagre filer på serveren

Noen ganger må binære objekter lagres i databasen. For eksempel filer. Hvis filen er stor, er det rimeligst å lagre den i en egen mappe på disken, og lagre banene i databasen. Eksempel:

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

Og i databasen lagrer vi bare en relativ bane til filen:

\12355\avatar.jpg

Det er praktisk å lagre en relativ bane i databasen, siden det da er lett å få en URL fra den:

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

Vi limer bare inn den relative banen til servernavnet, og vi er ferdige.

6.2 Lagre bilder direkte i databasen

Men hvis bildene er små, kan de lagres direkte i databasen og gis til klienten som et sett med byte. For slike tilfeller har SQL en spesiell BLOB- datatype - Binary Large Object. Eller rettere sagt, det er til og med to av dem:

  • CLOB - Character Large Object,
  • BLOB - Binært stort objekt.

CLOB brukes til å lagre svært store tekster. En BLOB er for lagring av binære data, for eksempel små bilder, videoer og lignende.

Eksempel:

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

	// ...
}

Merknaden @Lobforteller Hibernate at et stort objekt er lagret i feltet . Og columnDefinition="BLOB"snakker allerede om hvordan du lagrer alt i databasen.

La oss skrive en eksempelkode som lagrer en ny bruker og bildet hans i databasen:

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

Hibernate har interessant støtte for JSON som datatype. Den lar deg lagre en HashMap av strenger som et enkelt JSON-objekt. Hvis DBMS kan fungere med JSON, ser det slik ut:

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

Hibernate sørger for at typeobjektet Map<String, String>serialiseres til et enkelt JSON-objekt. Når du leser et objekt fra databasen, gjør det også JSON-objektet til et sett med Map<String, String>.

Hibernate kan gjøre noe lignende med XML:

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