gpt4 book ai didi

java - 保存更新时 hibernate NonUniqueObjectException

转载 作者:行者123 更新时间:2023-12-02 08:04:18 25 4
gpt4 key购买 nike

我有这个简单的情况:

@Entity
public class Customer{

@ManyToMany(fetch=FetchType.EAGER)
@Cascade(CascadeType.SAVE_UPDATE)
private List<Product> products=new ArrayList<Product>();

}

@Entity
public class Produtc{

@ManyToOne
@Cascade(CascadeType.SAVE_UPDATE)
private Category category;
}

@Entity
public class Category{

private String name;
}

插入新客户的例程:

Customer customer=new Customer();
//customer.set data
Product p=dao.getProductBySomeUserInput...
if(p==null){
p=new Product();
//p.set data
}
customer.addProduct(p);
dao.save(customer); //this row throw NonUniqueObjectException on Category class

我该如何解决这个问题?我认为问题与 CascadeType.SAVE_UPDATE 有关,但我需要它......谢谢大家。

<小时/>

更新

我发现了这个问题,这是如何复制它的:

Customer c=new Customer();
// Load two products by id
Product p=dao.get(Product.class, 2);
Product p1=dao.get(Product.class, 3);
c.addProduct(p);
c.addProduct(p1);
// This try to update products, and category of products becouse CascadeType is SAVE_UDPATE
dao.save(c);

因此,如果 p 和 p 1 具有不同的类别,则没有问题,但如果 p 和 p1 具有相同的类别,我在类别上有 NonUniqueObjectException,因为相同的类别在 session 中,并且 hibernate 尝试 save_update 其。

我在产品和类别实体中都需要 CascadeType.SAVE_UPDATE,那么如何解决此问题?谢谢。

最佳答案

该问题可能是由于不良的事务管理造成的。所有代码都应该在单个事务中完成,而不是为每个 DAO 调用都有一个事务。界定事务的应该是服务层,而不是DAO层。

我可以想象 Hibernate 的作用:

  1. 您调用dao.get(Product.class, 2)。这将返回一个指向 ID 为 67 的类别(例如)的独立产品。结果是分离的,因为当对 DAO 的调用结束时事务也结束。
  2. 您调用dao.get(Product.class, 3)。这将返回一个指向 ID 为 67 的类别(例如)的独立产品。但由于该调用在另一个事务中运行,因此您将获得第二个不同的 Category 实例(具有与第一个实例相同的 ID)。
  3. 您对产品调用 saveOrUpdate。这会级联到类别,因此 Hibernate 必须将类别 1 和类别 2 附加到 session 。由于它们具有相同的 ID,因此其中一个级联可能无法完成。

如果您使用单个事务来获取这两种产品,它们将具有相同的类别实例,并且不会出现该问题。调用 merge 而不是 saveOrUpdate 也应该有效:Hibernate 会将两个类别的状态复制到第三个附加类别。但正确的做法是使用涉及对 DAO 的两次调用的事务。

关于java - 保存更新时 hibernate NonUniqueObjectException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8408020/

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