(perbarui() pembaruan, jika tidak ada kunci utama, kesalahan akan dilaporkan.
saveOrUpdate() menyimpan atau memperbarui, melakukan penyisipan tanpa kunci utama.
Pembaruan: Ini adalah operasi pembaruan untuk sementara (sementara) atau hanya terlepas (terlepas). Operasi pembaruan untuk objek sementara biasanya tidak berpengaruh. Untuk objek yang terlepas, operasi sinkronisasi dilakukan, yaitu data dari database berubah. Dan status objek juga menjadi objek terkelola
SaveOrUpdate: Ini juga beroperasi pada operasi sementara atau terpisah. Adapun apakah akan memasukkan atau memperbarui, itu harus dianalisis sesuai dengan beberapa kondisi spesifik yang ditentukan dalam id. Namun, menurut saya pribadi, jika sudah jelas hanya operasi penyisipan yang akan terjadi, lebih baik hindari penggunaan saveOrUpdate dan gunakan simpan saja secara langsung)
Mari kita mulai dengan beberapa konsep:
Dalam Hibernate, konsep intinya adalah pengelolaan status PO. PO memiliki tiga status:
1. VO yang tidak menetap
Saat ini, ini adalah objek memori VO, dan siklus hidupnya dikelola oleh JVM.
2. PO telah dipertahankan, dan data database dipetakan saat ini selama siklus hidup Sesi, dan database mengelola siklus hidup tersebut.
3. Sudah ada, namun sekarang telah terlepas dari Sesi. Jika Anda menjalankan PO yang telah terlepas dari Sesi ini sebagai VO, Anda juga dapat memasuki Sesi lain dan terus mengelola status PO saat ini , itu menjadi PO. PO semacam ini sebenarnya bersilangan
Sesi melakukan pemeliharaan status.
Dalam JDO1.x tradisional, PO hanya memiliki dua status pertama. Setelah PO dipisahkan dari PM, PO kehilangan statusnya dan tidak lagi dikaitkan dengan data database.
Meskipun Anda menambahkan PM baru, statusnya tidak dapat dipulihkan.
Kekuatan Hibernate adalah setelah PO keluar dari Sesi, PO masih dapat mempertahankan status. Setelah memasuki Sesi baru, kemampuan pengelolaan status dipulihkan
Anda perlu menggunakan session.update atau session.saveOrUpdate, yang disebutkan dalam Referensi Hibernate dalam "memerlukan pemrograman yang sedikit berbeda
model"
Sekarang secara resmi masuk ke topik ini:
Sederhananya, update dan saveOrUpdate digunakan untuk mengelola status PO lintas sesi.
Dengan asumsi PO Anda tidak perlu melewati Session, maka tidak perlu menggunakannya. Misalnya, jika Anda membuka Session, mengoperasikan PO, lalu menutupnya, Anda tidak akan menggunakan PO ini lagi.
Maka tidak perlu menggunakan pembaruan.
Jadi mari kita lihat contoh di atas:
kode Jawa
Foo foo=sess.load(Foo.kelas,id);;
foo.setXXX(xxx);;
sess.flush();;
sess.commit();;
Foo foo=sess.load(Foo.class,id);; foo.setXXX(xxx);; sess.flush();;
Pengoperasian objek PO foo semuanya diselesaikan dalam siklus hidup Sesi, sehingga tidak perlu melakukan operasi secara eksplisit seperti sess.update(foo). Hibernate akan secara otomatis mendeteksi objek foo yang dimilikinya
telah dimodifikasi, sehingga pembaruan sql dikirim ke database. Tentu tidak salah jika Anda bersikeras menambahkan sess.update(foo), namun hal itu tidak perlu dilakukan.
Cross-Session artinya setelah Sesi ditutup, Anda masih menggunakan objek PO ini sebagai VO. Nanti Anda memodifikasi propertinya di luar Sesi, lalu Anda ingin membukanya kembali.
Buka Sesi dan simpan modifikasi atribut VO ke database, maka Anda perlu menggunakan pembaruan.
kode Jawa
// di sesi pertama
Cat cat = (Cat); firstSession.load(Cat.class, catId);;
Cat potensialMate = Cat baru();;
sesi pertama.save(potentialMate);;
// di tingkat aplikasi yang lebih tinggi
kucing.setMate(potentialMate);;
// nanti, di sesi baru
secondSession.update(kucing);; // perbarui kucing
secondSession.update(mate);; // perbarui sobat
// di sesi pertama Cat cat = (Cat); firstSession.load(Cat.class, catId);;
firstSession.save(potentialMate);; // di tingkat aplikasi yang lebih tinggi cat.setMate(potentialMate); // nanti, di a
sesi baru secondSession.update(cat);; // perbarui cat secondSession.update(mate); // perbarui sobat
Objek cat dan mate diperoleh pada sesi pertama. Setelah sesi pertama ditutup, mereka menjadi PO keadaan ketiga, dan PO yang Sesinya telah terlepas
Informasi status mereka masih dipertahankan. Saat memasuki sesi kedua, mereka bisa langsung update status. Namun karena operasi modifikasi pada cat: cat.setMate
(potentialMate); dilakukan di luar Sesi. Hibernate tidak dapat mengetahui bahwa objek cat telah diubah.
Panggil secondSession.update(cat); untuk memberi tahu Hibernate bahwa objek cat telah diubah dan Anda harus mengirimkan pembaruan sql.
Jadi inilah peran pembaruan. Ini hanya akan ditulis ketika objek PO menyinkronkan statusnya di seluruh Sesi. Ketika objek PO tidak perlu diproses di seluruh Sesi,
Saat melakukan pengelolaan negara, tidak perlu menulis pembaruan.
Mari kita bicara tentang penggunaan saveOrUpdate:
Perbedaan antara saveOrUpdate dan update terletak pada strategi yang diadopsi Hibernate untuk PO dalam manajemen status PO lintas Sesi.
Misalnya, saat Anda menulis DAOImpl, tambahkan mate ke objek cat, seperti yang didefinisikan di bawah ini:
kode Jawa
public void addMate(Kucing kucing, Teman sobat); {
Sesi sesi = ...;
Transaksi tx = ...;
sesi.update(cat);;
cat.addMate(mate);;
tx.commit();;
sesi.close();;
};
public void addMate(Kucing kucing, Teman sobat); { Sesi sesi = ...; Transacton tx = ...; sesi.update(kucing);;
cat.addMate(mate);; tx.commit();; sesi.close(); };
Tentunya Anda perlu merangkum operasi Hibernate di DAO, sehingga pemrogram lapisan bisnis dan pemrogram lapisan Web tidak perlu mengetahui Hibernate dan langsung memanggil DAO.
Pada titik ini muncul masalah: ada prasyarat yang diperlukan agar kode di atas dapat berjalan dengan benar, yaitu parameter pemanggilan metode objek cat harus berupa PO yang telah dipertahankan, yaitu harus
Pertama-tama tanyakan dari database dan kemudian gunakan seperti ini. Tetapi pemrogram di tingkat bisnis jelas tidak mengetahui misteri internal ini. Jika urusannya adalah menambahkan kucing sesekali
Sobatnya, dia jelas akan menyebutnya seperti ini, keluar objek kucing baru, lalu addMate:
kode Jawa
Kucing kucing = Kucing baru();;
kucing.setXXX();;
daoimpl.addMate(kucing,teman);;
Kucing kucing = Kucing baru();; kucing.setXXX();;
Namun perlu diketahui bahwa objek cat ini hanyalah VO, belum dipertahankan, bukan PO, dan tidak memenuhi syarat untuk memanggil metode addMate, jadi memanggil metode addMate tidak akan benar-benar masuk ke
Untuk mengirim update sql di database, objek cat harus disimpan ke database terlebih dahulu. Baru setelah benar-benar menjadi PO barulah bisa memenuhi syarat untuk addMate.
Anda harus melakukannya seperti ini:
kode Jawa
Kucing kucing = Kucing baru();;
kucing.setXXX();;
daoimpl.addCat(kucing);;
daoimpl.addMate(kucing, sobat);;
Kucing kucing = Kucing baru();; kucing.setXXX();; daoimpl.addCat(cat);;
Persist cat terlebih dahulu, lalu lakukan operasi persistensi lainnya pada kucing. Oleh karena itu, pemrogram di lapisan bisnis harus mengetahui keadaan objek cat, apakah yang pertama atau ketiga.
Kalau tipe pertama harus simpan dulu baru addMate; kalau tipe ketiga langsung addMate saja.
Namun yang paling fatal adalah jika keseluruhan software memiliki banyak layer, maka objek cat yang didapat oleh pemrogram lapisan bisnis mungkin adalah cat yang diteruskan dari lapisan aplikasi web atas, dan dia sendiri tidak mengetahui hal ini.
Apakah cat itu VO, belum bertahan, atau sudah bertahan, maka ia tidak punya cara untuk menulis program sama sekali.
Jadi DAOImpl seperti itu jelas bermasalah. Ini akan menyebabkan banyak jebakan pemrograman bagi pemrogram lapisan bisnis. Pemrogram lapisan bisnis harus memiliki pemahaman yang mendalam tentang setiap pasangan PO DAO yang mereka panggil.
Manajemen keadaan seperti apa yang dilakukan, Anda harus memiliki pemahaman yang mendalam tentang keadaan sebenarnya dari objek PO-nya setiap saat untuk memastikan kebenaran pemrograman
saveOrUpdate, masalah ini mudah diselesaikan.
Sekarang Anda perlu memodifikasi metode addMate:
kode Jawa
public void addMate(Kucing kucing, Teman sobat); {
Sesi sesi = ...;
Transaksi tx = ...;
sesi.saveOrUpdate(cat);;
cat.addMate(mate);;
tx.commit();;
sesi.close();;
};
public void addMate(Kucing kucing, Mate sobat); { Sesi sesi = ...; Transacton tx = ...;
(kucing);; kucing.addMate(mate);; tx.commit();; sesi.close();;
Seperti di atas, jika pemrogram lapisan bisnis meneruskan objek PO yang telah dipertahankan, maka Hibernate akan memperbarui objek cat tersebut (dengan asumsi pemrogram lapisan bisnis telah memodifikasinya di luar Sesi)
atribut cat), jika yang dilewatkan adalah objek baru, maka simpan objek PO tersebut ke database.
BTW: Apakah Hibernate memperbarui objek cat atau menyimpan objek cat saat ini bergantung pada pengaturan nilai yang tidak disimpan.
Dengan cara ini, pemrogram di lapisan bisnis tidak perlu lagi mengkhawatirkan status PO. Bagi mereka, tidak masalah apakah cat merupakan objek baru, hanya VO, atau ditanyakan dari database.
Terlepas dari objek PO, semuanya dapat ditambahkan langsung ke addMate:
kode Jawa
daoimple.addMate(kucing, sobat);;
daoimple.addMate(kucing, sobat);;
Inilah yang dilakukan saveOrUpdate.
Artikel ini berasal dari blog CSDN. Harap sebutkan sumbernya saat mencetak ulang: http://blog.csdn.net/zhrl0000/archive/2009/12/17/5027965.aspx
-