0
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更新数据库,我所有的C2数据都丢失了。实际结果是
类别=科学
费用=3000
推荐书籍=数学魔术
所以它实际上不是合并,而是完全覆盖。如何获得我的预期结果?

4

1 回答 1

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());
 }
 ...
于 2013-05-18T14:39:35.117 回答