6.1 Menyimpan file di server

Terkadang objek biner perlu disimpan ke database. Misalnya, file. Jika filenya besar, maka paling masuk akal untuk menyimpannya di folder terpisah di disk, dan menyimpan jalurnya di database. Contoh:

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

Dan di database kami hanya menyimpan jalur relatif ke file:

\12355\avatar.jpg

Akan lebih mudah untuk menyimpan jalur relatif dalam database, karena mudah untuk mendapatkan URL darinya:

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

Kami hanya menempelkan jalur relatif ke nama server dan selesai.

6.2 Simpan gambar langsung di database

Namun, jika gambarnya kecil, gambar tersebut dapat disimpan langsung di database dan diberikan kepada klien sebagai satu set byte. Untuk kasus seperti itu, SQL memiliki tipe data BLOB khusus - Binary Large Object. Atau lebih tepatnya, bahkan ada dua di antaranya:

  • CLOB - Karakter Objek Besar,
  • BLOB - Objek Besar Biner.

CLOB digunakan untuk menyimpan teks yang sangat besar. BLOB adalah untuk menyimpan data biner, seperti gambar kecil, video, dan sejenisnya.

Contoh:

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

	// ...
}

Anotasi @Lobmemberi tahu Hibernate bahwa Objek Besar disimpan di bidang . Dan columnDefinition="BLOB"sudah berbicara tentang cara menyimpan semuanya di database.

Mari tulis kode contoh yang menyimpan pengguna baru dan fotonya ke database:

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

Hibernate memiliki dukungan menarik untuk JSON sebagai tipe data. Ini memungkinkan Anda untuk menyimpan HashMap string sebagai objek JSON tunggal. Jika DBMS dapat bekerja dengan JSON, maka akan terlihat seperti ini:

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

Hibernate berhati-hati agar objek tipe Map<String, String>diserialisasi menjadi satu objek JSON. Selain itu, saat membaca objek dari database, ini mengubah objek JSON menjadi sekumpulan file Map<String, String>.

Hibernate dapat melakukan sesuatu yang mirip dengan XML:

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