У меня такая простая ситуация:
@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, так как одна и та же категория находится в сеансе и в спящем режимепопробуйте сохранить_создать его.
Мне нужен CascadeType.SAVE_UPDATE как в сущности «Продукт», так и в категории, так как я могу решить эту проблему?Спасибо.