6.1 Dateien auf dem Server speichern

Manchmal müssen binäre Objekte in der Datenbank gespeichert werden. Zum Beispiel Dateien. Wenn die Datei groß ist, ist es am sinnvollsten, sie in einem separaten Ordner auf der Festplatte zu speichern und ihre Pfade in der Datenbank zu speichern. Beispiel:

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

Und in der Datenbank speichern wir nur einen relativen Pfad zur Datei:

\12355\avatar.jpg

Es ist praktisch, einen relativen Pfad in der Datenbank zu speichern, da daraus dann leicht eine URL ermittelt werden kann:

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

Wir fügen einfach den relativen Pfad zum Servernamen ein und fertig.

6.2 Bilder direkt in der Datenbank speichern

Wenn die Bilder jedoch klein sind, können sie direkt in der Datenbank gespeichert und als Satz von Bytes an den Client übergeben werden. Für solche Fälle verfügt SQL über einen speziellen BLOB- Datentyp – Binary Large Object. Oder besser gesagt, es gibt sogar zwei davon:

  • CLOB – Charakter großes Objekt,
  • BLOB – Binäres großes Objekt.

CLOB wird zum Speichern sehr großer Texte verwendet. Ein BLOB dient zum Speichern von Binärdaten wie kleinen Bildern, Videos und dergleichen.

Beispiel:

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

	// ...
}

Die Annotation @Lobteilt Hibernate mit, dass ein großes Objekt im Feld gespeichert ist . Und columnDefinition="BLOB"spricht bereits darüber, wie man alles in der Datenbank speichert.

Schreiben wir einen Beispielcode, der einen neuen Benutzer und sein Foto in der Datenbank speichert:

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

Hibernate bietet interessante Unterstützung für JSON als Datentyp. Es ermöglicht Ihnen, eine HashMap von Zeichenfolgen als einzelnes JSON-Objekt zu speichern. Wenn das DBMS mit JSON arbeiten kann, dann sieht es so aus:

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

Hibernate sorgt dafür, dass das Typobjekt Map<String, String>in ein einzelnes JSON-Objekt serialisiert wird. Außerdem wird beim Lesen eines Objekts aus der Datenbank das JSON-Objekt in eine Reihe von Map<String, String>.

Ähnliches kann Hibernate mit XML machen:

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