【发布时间】:2011-12-06 22:48:37
【问题描述】:
我有这种简单的情况:
@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 因为相同的类别在会话中并且休眠尝试保存_更新它。
我在 Product 和 Category 实体中都需要 CascadeType.SAVE_UPDATE,那么我该如何解决这个问题? 谢谢。
【问题讨论】:
-
您是否有机会在客户对象上设置 id? hibernate的会话中是否已经存在具有相同id的对象?
-
EntityManager 中没有保存方法。您使用哪种方法来留住客户?此代码是否在唯一的事务中运行?
-
@JB Nizet:抱歉,entityManager 是我的一段代码,但是,dao.get 和 dao.save 都使用事务(我使用 spring 用 @Transactional 标记它们来管理事务),所以不,此代码不会在单个事务中运行。
-
我对项目中的每个实体都使用了一个实体管理器,因此像 save、delete、findById、findAll 这样的方法,每个都通过事务进行管理。
标签: java hibernate hibernate-cascade