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();
让我说我的初始数据库表数据是
category = maths
fee = 1000
recommendedBook =数学魔术
我认为上面的代码会将不常见的字段从C1复制到C2,并用C1覆盖C2的公共字段。所以预期的结果将是
category = science
费= 3000
recommendedBook =现代历史
但它只是将整个C1数据复制到C2并用C1更新了db,并且我的所有C2数据都丢失了。实际结果为
category = science
费= 3000
recommendedBook =数学魔术
所以它实际上并没有合并,而是完全压倒一切。如何获得我的预期结果?
答案 0 :(得分:3)
您看到的行为是预期的。 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());
}
...