6.1 Gem filer på serveren

Nogle gange skal binære objekter gemmes i databasen. For eksempel filer. Hvis filen er stor, så er det mest rimeligt at gemme den i en separat mappe på disken og gemme dens stier i databasen. Eksempel:

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

Og i databasen gemmer vi kun en relativ sti til filen:

\12355\avatar.jpg

Det er praktisk at gemme en relativ sti i databasen, da det så er nemt at få en URL fra den:

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

Vi indsætter bare den relative sti til servernavnet, og vi er færdige.

6.2 Gem billeder direkte i databasen

Men hvis billederne er små, kan de gemmes direkte i databasen og gives til klienten som et sæt bytes. Til sådanne tilfælde har SQL en speciel BLOB- datatype - Binary Large Object. Eller rettere, der er endda to af dem:

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

CLOB bruges til at gemme meget store tekster. En BLOB er til lagring af binære data, såsom små billeder, 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;

	// ...
}

Annoteringen @Lobfortæller Hibernate, at et stort objekt er gemt i feltet . Og columnDefinition="BLOB"taler allerede om, hvordan man gemmer det hele i databasen.

Lad os skrive en eksempelkode, der gemmer en ny bruger og hans foto 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 understøttelse af JSON som datatype. Det giver dig mulighed for at gemme et HashMap af strenge som et enkelt JSON-objekt. Hvis DBMS kan arbejde med JSON, så ser det sådan ud:

@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 læser et objekt fra databasen, forvandler det også JSON-objektet til et sæt af Map<String, String>.

Hibernate kan gøre noget lignende med XML:

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