Hibernate:将detatched实例数据合并到持久化实例中

时间:2013-05-18 14:28:07

标签: java hibernate merge persistence

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 =数学魔术
所以它实际上并没有合并,而是完全压倒一切。如何获得我的预期结果?

1 个答案:

答案 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());
 }
 ...