我在商店和产品之间存在多对多关系,由以下代码表示(主要基于this answer):
@Entity
@Table(name = "Store")
public class Store {
private long idStore;
// ...
private Collection<StoreHasProduct> storeHasProducts = new ArrayList<>();
@OneToMany(mappedBy = "store", cascade = {CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.EAGER)
public Collection<StoreHasProduct> getStoreHasProducts() {
return storeHasProducts;
}
public void setStoreHasProducts(Collection<StoreHasProduct> storeHasProducts) {
this.storeHasProducts = storeHasProducts;
}
}
@Entity
@Table(name="Product")
public class Product {
private long idProduct;
// ...
private Collection<StoreHasProduct> storeHasProducts = new ArrayList<>();
@OneToMany(mappedBy = "product", fetch = FetchType.LAZY)
public Collection<StoreHasProduct> getStoreHasProducts() {
return storeHasProducts;
}
public void setStoreHasProducts(Collection<StoreHasProduct> storeHasProducts) {
this.storeHasProducts = storeHasProducts;
}
}
@Entity
@Table(name = "Store_has_Product")
@IdClass(StoreHasProductPK.class)
public class StoreHasProduct implements java.io.Serializable {
@Id
@ManyToOne
@JoinColumn(name = "Store_idStore",updatable = true)
private Store store;
@Id
@ManyToOne
@JoinColumn(name = "Product_idProduct", updatable = true)
private Product product;
}
public class StoreHasProductPK implements java.io.Serializable {
private Long store;
private Long product;
}
所有基本插入工作正常。但是,当我尝试将新产品添加到现有商店时,我遇到PersistentObjectException: detached entity passed to persist
例外。例如,在以下测试中会发生这种情况:
@Test
public void testAssignProductToAnExistingStore() throws Exception {
//Create a store
Store store = getStore();
//Create and save a product
Product product = getProduct();
StoreHasProduct storeHasProduct = getStoreHasProduct(store, product);
store.getStoreHasProducts().add(storeHasProduct);
storeRepository.save(store);
//Create and save a second product
Product productTwo = getProduct();
Store s = storeRepository.findOne(store.getIdStore());
product.getStoreHasProducts().add(getStoreHasProduct(s, productTwo));
productRepository.save(product);
// s.getStoreHasProducts().add(getStoreHasProduct(s, productTwo));
// storeRepository.save(s);
}
如果我尝试坚持产品,我会detached entity passed to persist: Product
。如果我试着坚持商店(评论代码),我得到相同的例外但是商店。
我该怎么办?我正在尝试使用CASCADE.DETACH,但我不确定这是否适合遵循。
由于
答案 0 :(得分:0)
完全是关于配置实体管理器和/或事务管理器
看一看 How to save a new entity that refers existing entity in Spring JPA?