2013-03-17 22 views
5

Ho una relazione uno a molti: Una ProductCategory può contenere molti prodotti. Questo è il codice: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; 
    } 

} 

Questo è il codice Servlet che utilizzano le 2 entità:

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 

E questo è l'errore:

java.lang.IllegalStateException: Durante la sincronizzazione di un nuovo oggetto è stato trovato attraverso una relazione che non è stata contrassegnata in cascata PERSIST

Perché si verifica questo errore? Ho contrassegnato il campo come "cascade = CascadeType.All"!

risposta

10

Stai cercando di salvare un prodotto. E questo prodotto è collegato a una categoria. Pertanto, quando JPA salva il prodotto, la sua categoria deve già esistere o deve essere configurata una cascata in modo tale che il persistenza del prodotto venga interrotta per mantenere la categoria.

Ma non si dispone di una tale cascata. Quello che hai è una cascata che dice che qualsiasi operazione eseguita su una categoria ricade nel suo elenco di prodotti.

+0

quindi cosa devo fare? Se cambio il codice in: @OneToMany (cascade = CascadeType.PERSIST, mappedBy = "category") Elenco privato prodotti; non funziona neanche. Dà lo stesso errore. –

+4

La cascata si trova sul lato sbagliato dell'associazione. Stai dicendo a JPA: * quando ti chiedo di mantenere una categoria, anche i suoi prodotti persistono *. Ma tu non chiedi all'APP di persistere in una categoria. Chiedi di mantenere un prodotto. E da nessuna parte hai detto che quando un prodotto è persistente, la sua categoria deve anche essere mantenuta. –

+0

quindi da quale parte pensi che la notazione a cascata debba essere attiva? Finché so, in una relazione Many-To-One, è sempre sul lato inverso (significa il lato unico o un altro detto, il lato che contiene l'annotazione @OneToMany). –

Problemi correlati