org.hibernate.PersistentObjectException 多对一关系

Posted

技术标签:

【中文标题】org.hibernate.PersistentObjectException 多对一关系【英文标题】:org.hibernate.PersistentObjectException Many-to-one relationship 【发布时间】:2018-04-16 13:04:54 【问题描述】:

运行应用程序时,我从 MockData 收到 org.hibernate.PersistentObjectException 错误。这是什么原因造成的?我的级联类型错了吗?

org.hibernate.PersistentObjectException:分离的实体传递给 坚持

产品是在分类之后创建和添加的,那么分类应该存在吗?

Product.java

@Entity
@Data
@Table(name = "product")
@JsonIgnoreProperties("hibernateLazyInitializer", "handler")
public class Product 

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "manufacturer")
    private String manufacturer;

    @Column(name = "price")
    private double price;

    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "category_id")
    private Category category;

    public Product(String name, String manufacturer, double price, Category category) 
        this.name = name;
        this.manufacturer = manufacturer;
        this.price = price;
        this.category = category;
    

    public Product() 
    


Category.java

@Entity
@Data
@Table(name = "category")
public class Category 

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Column(name = "name")
    private String name;

    @OneToMany(mappedBy = "category", cascade = CascadeType.ALL)
    private List<Product> products;

    public Category(String name) 
        this.name = name;
    

    public Category() 
    

MockData.java

@Component
class MockData 

    private final ProductRepository productRepository;
    private final CategoryRepository categoryRepository;

    @Autowired
    public MockData(ProductRepository productRepository, CategoryRepository categoryRepository) 
        this.productRepository = productRepository;
        this.categoryRepository = categoryRepository;

        loadData();
    

    private void loadData() 

        Category IT = new Category("IT");
        Category beauty = new Category("Beauty");
        Category food = new Category("Food");

        categoryRepository.save(IT);
        categoryRepository.save(beauty);
        categoryRepository.save(food);

        Product computer = new Product("Computer", "Dell", 5000, IT);
        Product computer2 = new Product("Computer2", "HP", 5000, IT);
        Product eyeliner = new Product("Eyeliner", "Chanel", 100, beauty);
        Product hamburger = new Product("Angus", "Burger King", 100, food);

        productRepository.save(computer);
        productRepository.save(computer2);
        productRepository.save(eyeliner);
        productRepository.save(hamburger);
    

【问题讨论】:

我已经在这里回答了类似的问题:***.com/questions/49554459/…我猜?尝试初始化您的 products 集合 Detached entity passed to persist error的可能重复 【参考方案1】:

将 mockdata 更改为以下解决了问题:

@Component
class MockData 

    private final ProductRepository productRepository;
    private final CategoryRepository categoryRepository;

    @Autowired
    public MockData(ProductRepository productRepository, CategoryRepository categoryRepository) 
        this.productRepository = productRepository;
        this.categoryRepository = categoryRepository;

        loadData();
    

    private void loadData() 

        Category IT = new Category("IT");
        Category beauty = new Category("Beauty");
        Category food = new Category("Food");

        Product computer = new Product("Computer", "Dell", 5000, IT);
        Product computer2 = new Product("Computer2", "HP", 5000, IT);
        Product eyeliner = new Product("Eyeliner", "Chanel", 100, beauty);
        Product hamburger = new Product("Angus", "Burger King", 100, food);

        IT.setProducts(Arrays.asList(computer, computer2));
        beauty.setProducts(Collections.singletonList(eyeliner));
        food.setProducts(Collections.singletonList(hamburger));

        categoryRepository.save(IT);
        categoryRepository.save(beauty);
        categoryRepository.save(food);

        productRepository.save(computer);
        productRepository.save(computer2);
        productRepository.save(eyeliner);
        productRepository.save(hamburger);
    

产品在保存之前被创建并添加到类别中。

【讨论】:

以上是关于org.hibernate.PersistentObjectException 多对一关系的主要内容,如果未能解决你的问题,请参考以下文章