Java JPA:将更多对象(产品)添加到已保存的实体(商店)

时间:2014-10-22 15:44:44

标签: java entity-framework hibernate jpa

我在商店和产品之间存在多对多关系,由以下代码表示(主要基于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,但我不确定这是否适合遵循。

由于

1 个答案:

答案 0 :(得分:0)

完全是关于配置实体管理器和/或事务管理器

看一看 How to save a new entity that refers existing entity in Spring JPA?