0

I have a many-to-many relationship between Stores and Products, represented by the following code (mostly based in 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;
}

All basic insertion are working fine. However, when I try to add new Products to a existing Store I'm having a PersistentObjectException: detached entity passed to persist exception. This happens, for example, in the following test:

@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);

    }

If I try to persist the product, I get detached entity passed to persist: Product. If instead I try to persist the store (commented code) I get the same exception but for store.

What should I do? I'm trying to use the CASCADE.DETACH, but I'm not sure if this is the appropriate path to follow.

Thanks

Community
  • 1
  • 1
Pedro Dusso
  • 2,100
  • 9
  • 34
  • 64

1 Answers1

0

it's all about configuring Entity manager and/or Transaction manager

take a look How to save a new entity that refers existing entity in Spring JPA?

Community
  • 1
  • 1
Puh
  • 305
  • 1
  • 10