Pilihan status objek yang mungkin

Seperti yang mungkin anda perhatikan, apabila objek dilampirkan pada Hibernate, keadaannya dipanggil Persistent atau Managed . Betul ke? Bertahan atau Terurus?

Ia mungkin dan begitu, dan sebagainya. Menurut spesifikasi JPA, objek mempunyai keadaan Persist, dan mengikut spesifikasi Hibernate, keadaannya dipanggil Terurus.

Dalam Hibernate, kerja dengan pangkalan data dijalankan melalui objek jenis org.hibernate.Session . Menurut JPA, kelas itu harus dipanggil javax.persistence.EntityManager. Ini sebenarnya bukan masalah besar, kerana kedua-dua jenis adalah antara muka.

Antara muka org.hibernate.Session diisytiharkan seperti ini:

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

}

Oleh itu, antara muka Sesi mempunyai semua kaedah yang terdapat dalam antara muka EntityManager . Tetapi ia juga mempunyai sendiri, yang diwarisi daripada versi Hibernate terdahulu, apabila belum ada spesifikasi JPA lagi.

Keseluruhan keadaan ini digambarkan seperti berikut:

Mari kita lihat semua kaedah yang terdapat pada antara muka sesi, serta nuansa kerja mereka.

Nuansa kaedah persist().

Apabila menyimpan objek ke pangkalan data, anda perlu mengingati dua perkara.

Pertama, menyimpan objek akhirnya akan menghasilkan pelaksanaan salah satu arahan SQL: INSERT atau UPDATE. Kedua, tindakan ini tidak akan berlaku serta-merta selepas memanggil kaedah objeksesi, tetapi hanya selepas menutup transaksi.

Mari kita pertimbangkan beberapa situasi mudah, sebagai contoh, anda mempunyai kelas Pengguna :

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

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

Mari kita simpan objeknya ke pangkalan data menggunakan kaedah persist() .

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

Tujuan kaedah ini adalah untuk menyimpan objek baru ke pangkalan data. Jika belum ada objek sedemikian, maka ia akan ditambahkan ke pangkalan data dengan memanggil kaedah INSERT SQL .

Jika objek sudah berada dalam pangkalan data, maka tiada apa yang akan berlaku. Walau bagaimanapun, kes ketiga juga mungkin - percubaan untuk menyimpan objek dengan status Detached ke pangkalan data. Dalam kes 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 kaedah save().

Kaedah save() telah diwarisi oleh Hibernate semasa daripada versi sebelumnya. Pada terasnya, ia sangat serupa dengan kaedah persist() , ia juga menambah rekod baharu pada jadual menggunakan kaedah INSERT. Walau bagaimanapun, ia mempunyai beberapa nuansa menarik.

Pertama, kaedah ini mengembalikan nilai - ID baharu objek . Seperti yang anda sedia maklum, objek biasanya tidak mempunyai ID sebelum ditambahkan ke pangkalan data dan ia sudah ditetapkan oleh pangkalan data. Jadi, kaedah save() bagi objek sesi mengembalikan ID yang telah diberikan kepada objek yang disimpan.

Penting! Menurut spesifikasi ID Hibernate, ia boleh menjadi sebarang objek boleh bersiri, bukan sekadar nombor. Ia boleh menjadi rentetan, nombor, enum, apa sahaja secara umum yang boleh diletakkan sepenuhnya dalam satu lajur jadual dalam pangkalan data.

Kaedah save() mempunyai jenis hasil bersiri, jadi hasilnya mesti dihantar ke jenis yang betul:

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

Selain itu, kaedah save() mempunyai gelagat yang berbeza dalam kes keadaan Detached objek. Ia menganggap objek sedemikian sebagai baru dan hanya menambah 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);

Pembolehubah id dan id2 akan berbeza. Dua rekod akan ditambahkan pada jadual dalam pangkalan data, satu untuk setiap operasi save() .