2013-03-17 20 views
5

Bir Çoktan İlişki var: Bir ProductCategory çok Ürün içerebilir.JPA Cascade Persist Hatası

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 

Ve bu hatadır:

java.lang.IllegalStateException: senkronizasyon yeni esnasında bu 2 varlıkları kullanmak Servlet kodu

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

} 

geçerli: Bu kodudur nesne işaretli olmayan bir ilişki aracılığıyla bulundu. PERSIST

Bu hata neden oluyor? Alanı "cascade = CascadeType.All" olarak işaretledim!

cevap

10

Bir ürünü kaydetmeye çalışıyorsunuz. Ve bu ürün bir kategoriye bağlı. Bu yüzden JPA ürünü kaydettiğinde, kategorisi zaten mevcut olmalı ya da ürün basamaklarını kalıcı hale getirecek şekilde yapılandırılmış bir kaskat olmalıdır.

Ama böyle bir çağlayan yok. Sahip olduğunuz şey, bir kategori üzerinde yapılan herhangi bir işlemin, ürün listesine dahil olduğunu belirten bir çağlayan.

+0

ne yapmalıyım? Kodu değiştirirseniz: @OneToMany (kaskad = CascadeType.PERSIST, mappedBy = "kategori") özel Liste ürünler; , ya çalışmıyor. Aynı hatayı veriyor. –

+4

Kaskad, ilişkinin yanlış tarafında. JPA'ya söylüyorsunuz: * Bir kategoriyi devam ettirmenizi istediğimde, aynı zamanda ürünlerini de * koruyun. Ama JPA'dan bir kategoriyi ısrar etmesini istemiyorsunuz. Bir ürünü ısrar etmesini istiyorsun. Ve hiçbir yerde, bir ürün kalıcı olduğunda, kategorisinin de kalıcı olması gerektiğini söylemedin. –

+0

Yani hangi tarafta çağlayan notasyonu açık olmalı? Bildiğim kadarıyla, Bire-Bir ilişkide, her zaman ters taraftadır (tek taraflı veya başka bir deyişle, @OneToMany ek açıklamasını içeren taraf). –