簡體   English   中英

Hibernate:將已分離的實例數據合並到持久實例中

[英]Hibernate : merge detatched instance data in to persistent instance

Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
Course c1 = (Course) session.get(Course.class, 1);
tx.commit();
session.close();
c1.setCategory("science");
c1.setFee("3000");

//C1 became detached instance here

session = HibernateUtil.getSessionFactory().openSession(); 
tx = session.beginTransaction();
Course c2 = (Course) session.get(Course.class, 1);
c2.setCategory("social");
c2.setRecommendedBook("Modern History");
session.merge(c1);
tx.commit();
session.close();

可以說我的初始數據庫表數據是
類別=數學
費用= 1000
薦書=數學魔術

我以為上面的代碼會將不常見的字段從C1復制到C2,並用C1覆蓋C2的公共字段。 所以預期的結果是
類別=科學
費用= 3000
薦書=現代史

但是它只是將整個C1數據復制到C2中並用C1更新了db,因此我的所有C2數據都丟失了。
類別=科學
費用= 3000
薦書=數學魔術
因此,它的實際作用不是合並,而是完全覆蓋。 如何獲得我的預期結果?

您看到的行為是預期的。 Hibernate如何知道某些字段必須合並而另一些字段不能合並? null是所有字段的有效值,並且通過合並將字段設置為null是完全有效的操作。

要獲得結果,請合並要顯式合並的字段:

 Course c2 = (Course) session.get(Course.class, 1);
 c2.setCategory("social");
 c2.setRecommendedBook("Modern History");
 if (c1.getCategory != null) {
     c2.setCategory(c1.getCategory());
 }
 if (c1.getRecommendedBook() != null) {
     c2.setRecommendedBook(c1.getRecommendedBook());
 }
 ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM