2013-03-17 3 views
5

У меня есть отношения «один-ко-многим»: ProductCategory может содержать много продуктов. Это код:JPA Cascade Persist Error

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

} 

Это Servlet код, который использует 2 сущность:

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 

И это ошибка:

java.lang.IllegalStateException: Во время синхронизации новой объект был найден через связь, которая не была отмечена каскадом PERSIST

Почему эта ошибка происходит? Я отметил поле как «cascade = CascadeType.All»!

ответ

10

Вы пытаетесь сохранить продукт. И этот продукт связан с категорией. Поэтому, когда JPA сохраняет продукт, его категория должна уже существовать, или должен быть настроен каскад, так что сохранение продукта в каскадах сохраняется в своей категории.

Но у вас нет такого каскада. У вас есть каскад, говорящий, что любая операция, выполняемая в категории, каскадируется в ее списке продуктов.

+0

поэтому что делать? Если я сменил код на: @OneToMany (cascade = CascadeType.PERSIST, mappedBy = "category") private List продукты; тоже не работает. Это дает ту же ошибку. – 2013-03-17 09:59:59

+4

Каскад находится на неправильной стороне ассоциации. Вы говорите JPA: *, когда я прошу вас сохранить категорию, также сохраняйте свои продукты *. Но вы не просите JPA сохранить категорию. Вы просите его сохранить продукт. И нигде вы не сказали, что когда продукт сохраняется, его категория также должна сохраняться. –

+0

так на какой стороне, по-вашему, должно быть включено каскадное обозначение? До тех пор, как я знаю, в отношениях «Много-к-одному» он всегда находится на обратной стороне (означает одностороннее или другое высказывание, сторона, которая содержит аннотацию @OneToMany). – 2013-03-17 10:12:52

Смежные вопросы