JPA 级联持续错误

Posted

技术标签:

【中文标题】JPA 级联持续错误【英文标题】:JPA Cascade Persist Error 【发布时间】:2013-03-05 18:14:21 【问题描述】:

我有一个一对多的关系:一个 ProductCategory 可以包含许多产品。这是代码:

@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 个实体的 Servlet 代码:

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:在同步期间,通过未标记为级联 PERSIST 的关系找到了一个新对象

为什么会发生这个错误?我将该字段标记为“cascade = CascadeType.All”!

【问题讨论】:

【参考方案1】:

您正在尝试保存产品。该产品与一个类别相关联。因此,当 JPA 保存产品时,它的类别必须已经存在,或者必须配置一个级联,以便持久化产品级联到持久化其类别。

但你没有这样的级联。你所拥有的是一个级联,即对一个类别执行的任何操作都会级联到其产品列表。

【讨论】:

那我该怎么办?如果我将代码更改为: @OneToMany(cascade= CascadeType.PERSIST,mappedBy="category") private List products;它也不起作用。它给出了同样的错误。 级联在关联的错误一侧。您是在告诉 JPA:当我要求您保留一个类别时,也要保留其产品。但是您不会要求 JPA 保留一个类别。你要求它持久化一个产品。而且你没有说过当一个产品被持久化时,它的类别也必须被持久化。 那么你认为级联符号应该放在哪一边?据我所知,在多对一关系中,它总是在反面(意思是一面或另一种说法,即包含 @OneToMany 注释的一面)。 一个关联只有两个方面,而你的级联在你想做的事情上是错误的。你推断什么?你的假设是错误的。您可以在任意一侧放置级联。 当实体已存在于数据库中但不再受管理时,我经常收到此错误。我必须得到它的参考。这很烦人。

以上是关于JPA 级联持续错误的主要内容,如果未能解决你的问题,请参考以下文章

JPA 级联持续存在并且对分离实体的引用会引发 PersistentObjectException。为啥?

JPA,已经持久化的对象给出了“通过未标记级联 PERSIST 的关系找到了一个新对象”

JPA:OptimisticLockException 和级联

你好! jpa里不能级联删除。我看你在百度知道里已经解决了这个问题。请问,是怎么解决的!谢谢

Spring Data Jpa MVC - 数据未插入,但在测试期间持续存在

JPA/Hibernate 级联删除不起作用