2013-03-17 18 views
5

私は一対多の関係を持っています:ProductCategoryには多くのProductが含まれています。これはコードです:JPAカスケード永続エラー

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

} 

これは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:同期の新しい中、カスケードとマークされていない関係でオブジェクトが見つかりました。

このエラーはなぜ発生しますか?フィールドを「cascade = CascadeType.All」とマークしました!

答えて

10

あなたは製品を保存しようとしています。この製品はカテゴリにリンクされています。そのため、JPAが製品を保存するときに、そのカテゴリがすでに存在しているか、カスケードが設定されていなければ、製品カスケードがそのカテゴリを永続させることができません。

しかし、このようなカスケードはありません。あなたが持っているのは、カテゴリで行われた操作がその製品リストにカスケードするというカスケードです。

+0

どうすればよいですか? @OneToMany(カスケード= CascadeType.PERSIST、mappedBy = "category") プライベートリストの製品にコードを変更すると、 どちらも動作しません。同じエラーが発生します。 –

+4

カスケードがアソシエーションの間違った側にあります。あなたはJPAに次のように伝えています。しかし、あなたはJPAにカテゴリを残すように求めることはありません。あなたは製品を永続させるように頼んでいます。そして、製品が永続化されるときに、そのカテゴリも永続化されなければならないとあなたは言いませんでした。 –

+0

カスケード記法はどのような面にあると思いますか?私が知っている限り、多対1の関係では、常に逆の側にあります(片側または別の言い方で、@OneToManyアノテーションを含む側を意味します)。 –