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 @Lob
fortæ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;