gpt4 book ai didi

java - hibernate : merge detatched instance data in to persistent instance

转载 作者:行者123 更新时间:2023-12-01 23:48:42 29 4
gpt4 key购买 nike

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
推荐书籍=数学魔法
所以它实际上不是合并,而是完全压倒一切。如何得到我预期的结果?

最佳答案

您看到的行为是预期的。 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());
}
...

关于java - hibernate : merge detatched instance data in to persistent instance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16625366/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com