6 Stimmen

JPA Cascade Persist Fehler

Ich habe eine One-to-Many-Beziehung: Eine Produktkategorie kann viele Produkte enthalten. Dies ist der Code:

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

    public String getCategoryName() {
        return categoryName;
    }

    public void setCategoryName(String productName) {
        this.categoryName = productName;
    }

    public List getProducts() {
        return products;
    }

    public void setProducts(List products) {
        this.products = products;
    }

}

Dies ist der Servlet-Code, der die 2 Entitäten verwendet:

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 wird vom Container injiziert

Und das ist der Fehler:

java.lang.IllegalStateException: Während der Synchronisierung wurde ein neues Objekt durch eine Beziehung gefunden, die nicht als CASCADE PERSIST markiert war

Warum tritt dieser Fehler auf? Ich habe das Feld als "cascade = CascadeType.ALL" markiert!

10voto

JB Nizet Punkte 654813

Sie versuchen, ein Produkt zu speichern. Und dieses Produkt ist mit einer Kategorie verknüpft. Wenn also JPA das Produkt speichert, muss seine Kategorie bereits existieren oder es muss ein Cascade konfiguriert sein, damit das Persistieren des Produkts zum Persistieren seiner Kategorie führt.

Aber Sie haben keine solche Cascade. Was Sie haben, ist eine Cascade, die besagt, dass jede Operation, die an einer Kategorie durchgeführt wird, auf ihre Liste von Produkten übergeht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X