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!
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. –
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. –
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). –