6.1 Bewaar bestanden op de server

Soms moeten binaire objecten in de database worden opgeslagen. Bijvoorbeeld bestanden. Als het bestand groot is, is het het meest redelijk om het in een aparte map op de schijf op te slaan en de paden in de database op te slaan. Voorbeeld:

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

En in de database slaan we alleen een relatief pad naar het bestand op:

\12355\avatar.jpg

Het is handig om een ​​relatief pad in de database op te slaan, omdat je er dan gemakkelijk een URL uit kunt halen:

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

We plakken gewoon het relatieve pad naar de servernaam en we zijn klaar.

6.2 Bewaar afbeeldingen direct in de database

Als de afbeeldingen echter klein zijn, kunnen ze rechtstreeks in de database worden opgeslagen en als een set bytes aan de klant worden gegeven. Voor dergelijke gevallen heeft SQL een speciaal BLOB -gegevenstype : Binary Large Object. Of beter gezegd, er zijn er zelfs twee:

  • CLOB - Karakter groot object,
  • BLOB - Binair groot object.

CLOB wordt gebruikt om zeer grote teksten op te slaan. Een BLOB is voor het opslaan van binaire gegevens, zoals kleine afbeeldingen, video's en dergelijke.

Voorbeeld:

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

	// ...
}

De annotatie @Lobvertelt Hibernate dat er een groot object in het veld is opgeslagen . En columnDefinition="BLOB"praat al over hoe je alles in de database kunt opslaan.

Laten we een voorbeeldcode schrijven die een nieuwe gebruiker en zijn foto in de database opslaat:

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

Hibernate heeft interessante ondersteuning voor JSON als datatype. Hiermee kunt u een HashMap van tekenreeksen opslaan als een enkel JSON-object. Als het DBMS met JSON kan werken, ziet het er zo uit:

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

Hibernate zorgt ervoor dat het type object Map<String, String>wordt geserialiseerd tot een enkel JSON-object. Bij het lezen van een object uit de database verandert het JSON-object ook in een set Map<String, String>.

Hibernate kan iets soortgelijks doen met XML:

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