Memetakan Data LOB di Hibernate

1. Gambaran keseluruhan

LOB atau Large OBject merujuk kepada jenis data panjang berubah untuk menyimpan objek besar.

Jenis data mempunyai dua varian:

  • CLOB - Objek Besar Karakter akan menyimpan data teks yang besar
  • BLOB - Objek Besar Binari adalah untuk menyimpan data binari seperti gambar, audio, atau video

Dalam tutorial ini, kami akan menunjukkan bagaimana kami dapat menggunakan Hibernate ORM untuk mempertahankan objek besar.

2. Persediaan

Sebagai contoh, kami akan menggunakan Pangkalan Data Hibernate 5 dan H2. Oleh itu, kita mesti menyatakannya sebagai pergantungan dalam pom.xml kami :

 org.hibernate hibernate-core 5.4.12.Final   com.h2database h2 1.4.196 

Versi kebergantungan terkini terdapat di Maven Central Repositories.

Untuk melihat lebih mendalam mengenai mengkonfigurasi Hibernate, sila rujuk salah satu artikel pengenalan kami.

3. Model Data LOB

Model "Pengguna" kami mempunyai id, nama, dan foto sebagai sifat. Kami akan menyimpan gambar di harta foto Pengguna , dan kami akan memetakannya ke BLOB:

@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; // ... }

The @Lob dinyatakan oleh anotasi yang pangkalan data perlu menyimpan harta itu sebagai Objek besar . The columnDefinition dalam @column anotasi mentakrifkan jenis lajur untuk harta.

Oleh kerana kita akan menyimpan array byte , kita menggunakan BLOB.

4. Penggunaan

4.1. Mulakan Sesi Hibernate

session = HibernateSessionUtil .getSessionFactory("hibernate.properties") .openSession();

Dengan menggunakan kelas pembantu, kami akan membina Hibernate Session menggunakan maklumat pangkalan data yang disediakan dalam fail hibernate.properties .

4.2. Membuat Contoh Pengguna

Mari kita anggap pengguna memuat naik foto sebagai fail gambar:

User user = new User(); InputStream inputStream = this.getClass() .getClassLoader() .getResourceAsStream("profile.png"); if(inputStream == null) { fail("Unable to get resources"); } user.setId("1"); user.setName("User"); user.setPhoto(IOUtils.toByteArray(inputStream)); 

Kami menukar fail gambar menjadi array byte dengan menggunakan bantuan perpustakaan Apache Commons IO , dan akhirnya, kami menetapkan array byte sebagai sebahagian dari objek Pengguna yang baru dibuat .

4.3. Objek Besar Yang Berterusan

Dengan menyimpan Pengguna menggunakan Sesi , Hibernate akan menukar objek ke dalam rekod pangkalan data:

session.persist(user); 

Kerana anotasi @Lob dinyatakan pada Pengguna kelas , Hibernate memahami bahawa ia harus menyimpan harta "foto" sebagai jenis data BLOB .

4.4. Pengesahan Data

Kami akan mengambil kembali data dari pangkalan data dan menggunakan Hibernate untuk memetakannya kembali ke objek Java untuk membandingkannya dengan data yang dimasukkan.

Kerana kita tahu yang dimasukkan pengguna ' s id , kami akan menggunakannya untuk mendapatkan semula data dari pangkalan data:

User result = session.find(User.class, "1"); 

Mari bandingkan hasil pertanyaan dengan input Pengguna data:

assertNotNull( "Query result is null", result); assertEquals( "User's name is invalid", user.getName(), result.getName() ); assertTrue( "User's photo is corrupted", Arrays.equals(user.getPhoto(), result.getPhoto()) ); 

Hibernate akan memetakan data dalam pangkalan data ke objek Java menggunakan maklumat pemetaan yang sama pada anotasi.

Oleh itu objek Pengguna yang diambil akan mempunyai maklumat yang sama dengan data yang dimasukkan.

5. Kesimpulan

LOB adalah jenis data untuk menyimpan data objek besar. Terdapat dua jenis LOB yang disebut BLOB dan CLOB . BLOB adalah untuk menyimpan data binari, sementara CLOB adalah untuk menyimpan data teks.

Dengan menggunakan Hibernate , kami telah menunjukkan betapa mudahnya memetakan data ke dan dari objek Java , selama kita menentukan model data yang betul dan struktur jadual yang sesuai dalam pangkalan data.

Seperti biasa kod untuk artikel ini terdapat di GitHub.