[英]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.