Opsi status objek yang memungkinkan

Seperti yang mungkin Anda perhatikan, ketika sebuah objek dilampirkan ke Hibernate, statusnya disebut Persistent atau Managed . Bagaimana benar? Bertahan atau Dikelola?

Itu mungkin dan begitu, dan begitu. Menurut spesifikasi JPA, sebuah objek memiliki status Persist, dan menurut spesifikasi Hibernasi, statusnya disebut Terkelola.

Di Hibernate, bekerja dengan database dilakukan melalui objek bertipe org.hibernate.Session . Menurut JPA, kelas tersebut harus disebut javax.persistence.EntityManager. Ini sebenarnya bukan masalah besar, karena kedua tipe tersebut adalah antarmuka.

Antarmuka org.hibernate.Session dideklarasikan seperti ini:

interface Session extends java.lang.AutoCloseable, javax.persistence.EntityManager, HibernateEntityManager,    QueryProducer, java.io.Serializable, SharedSessionContract {

}

Oleh karena itu, antarmuka Sesi memiliki semua metode yang ada di antarmuka EntityManager . Tetapi ia juga memiliki miliknya sendiri, yang diwarisi dari Hibernate versi sebelumnya, ketika belum ada spesifikasi JPA.

Seluruh situasi ini digambarkan sebagai berikut:

Mari kita lihat semua metode yang dimiliki antarmuka sesi, serta nuansa kerjanya.

Nuansa metode persist()

Saat menyimpan objek ke database, Anda perlu mengingat dua hal.

Pertama, menyimpan objek pada akhirnya akan menghasilkan eksekusi salah satu perintah SQL: INSERT atau UPDATE. Kedua, tindakan ini tidak akan terjadi segera setelah memanggil metode objeksidang, tetapi hanya setelah menutup transaksi.

Mari pertimbangkan beberapa situasi sederhana, misalnya, Anda memiliki kelas Pengguna :

@Entity
public class User {
	@Id
	@GeneratedValue
    public Integer id;

	@Columnt(name=”user_name”)
    public String name;
}

Mari simpan objeknya ke database menggunakan metode persist() .

User user = new User();
user.setName("Kolyan");
session.persist(user);

Tujuan dari metode ini adalah untuk menyimpan objek baru ke database. Jika belum ada objek seperti itu, maka akan ditambahkan ke database dengan memanggil metode INSERT SQL .

Jika objek sudah ada di database, maka tidak akan terjadi apa-apa. Namun, kasus ketiga juga dimungkinkan - upaya untuk menyimpan objek dengan status Terpisah ke database. Dalam hal ini, pengecualian akan dilemparkan. Contoh:

User user = new User();
user.setName("Kolyan");
session.persist(user);

session.evict(user);     // detach the object from the session
session.persist(user); // a PersistenceException will be thrown here!

Nuansa metode save()

Metode save() diwarisi oleh Hibernate saat ini dari versi sebelumnya. Pada intinya, ini sangat mirip dengan metode persist() , metode ini juga menambahkan record baru ke tabel menggunakan metode INSERT. Namun, ia memiliki beberapa nuansa menarik.

Pertama, metode ini mengembalikan nilai - ID baru dari objek . Seperti yang sudah Anda ketahui, objek biasanya tidak memiliki ID sebelum ditambahkan ke database dan sudah ditetapkan oleh database. Jadi, metode save() dari objek sesi mengembalikan ID yang ditetapkan ke objek yang disimpan.

Penting! Menurut spesifikasi Hibernate ID, itu bisa berupa objek apa pun yang dapat diserialkan, bukan hanya angka. Itu bisa berupa string, angka, enum, apa pun secara umum yang dapat diletakkan seluruhnya dalam satu kolom tabel dalam database.

Metode save() memiliki tipe hasil Serial, jadi hasilnya harus dilemparkan ke tipe yang benar:

User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);

Selain itu, metode save() memiliki perilaku berbeda dalam kasus status Detached objek. Itu menganggap objek seperti baru dan hanya menambahkan entri lain:

User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);

session.evict(user); 	// detach the object from the session
Integer id2 = (Integer) session.save(user);

Variabel id dan id2 akan berbeda. Dua record akan ditambahkan ke tabel dalam database, satu untuk setiap operasi save() .