JPA Cascade Persist Error

cascade, jpa, persist

Solution

You're trying to save a product. And this product is linked to a category. So when JPA saves the product, its category must already exist, or there must be a cascade configured so that persisting the product cascades to persisting its category.

But you don't have such a cascade. What you have is a cascade saying that any operation done on a category cascades to its list of products.

Problem

I have a One-to-Many relationship: A ProductCategory can contains many Product. This is the code: ``` @Entity public class Product implements Serializable { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private String id; @Column(name="ProductName") private String name; private BigDecimal price; private String description; @ManyToOne @JoinColumn(name="UserId") private User user; @ManyToOne @JoinColumn(name="Category") private ProductCategory category; private static final long serialVersionUID = 1L; public Product() { super(); } public String getId() { return this.id; } public void setId(String id) { this.id = id; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public BigDecimal getPrice() { return this.price; } public void setPrice(BigDecimal price) { this.price = price; } public String getDescription() { return this.description; } public void setDescription(String description) { this.description = description; } public User getUser() { return this.user; } public void setUser(User user) { this.user = user; } public ProductCategory getCategory() { return this.category; } public void setCategory(ProductCategory category) { this.category = category; } } @Entity public class ProductCategory { @Id private String categoryName; @OneToMany(cascade= CascadeType.ALL,mappedBy="category") private List<Product> products; public String getCategoryName() { return categoryName; } public void setCategoryName(String productName) { this.categoryName = productName; } public List<Product> getProducts() { return products; } public void setProducts(List<Product> products) { this.products = products; } } ``` This is Servlet code which use the 2 entities: ``` String name = request.getParameter("name"); BigDecimal price = new BigDecimal(request.getParameter("price")); String description = request.getParameter("description"); ProductCategory category = new ProductCategory(); category.setCategoryName(request.getParameter("category")); Product product = new Product(); product.setName(name); product.setPrice(price); product.setDescription(description); product.setCategory(category); User user = userManager.findUser("Meow"); product.setUser(user); productManager.createProduct(product); // productManager is an EJB injected by container ``` And this is the error: java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST Why does this error happen? I marked the field as "cascade = CascadeType.All"!

Original source