JPA @OneToMany 不保存父 ID

Posted

技术标签:

【中文标题】JPA @OneToMany 不保存父 ID【英文标题】:JPA @OneToMany doesn't save parent ID 【发布时间】:2018-11-06 02:20:36 【问题描述】:

我使用 Spring Boot 和 JPA 开发 API

我在双向 OneToMany 关系中发现了一个案例,当 JSON 有效负载这样请求时,我的父 ID 没有保存在数据库中:


    "name": "Rice",
    "description": "Lorem ipsum dolor sit amet",
    "variants": [
        
            "amount": 1,
            "unit": "kg",
            "price": 60000
        
    ]

这是我的模型:

Product.kt

data class Product(
        @Id
        @GeneratedValue
        var id: Long = 0,
        var name: String = "",
        var photo: String = "",
        var description: String = "",

        @OneToMany(mappedBy = "product", cascade = [CascadeType.ALL])
        @JsonBackReference
        var variants: MutableList<Variant> = mutableListOf()
)

Variant.kt

@Entity
data class Variant(
        @Id
        @GeneratedValue
        var id: Long = 0,
        var amount: Int = 0,
        var unit: String = "",
        var price: Double = 0.0,

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "product_id")
        @JsonManagedReference
        var product: Product? = null
)

是否需要应用其他配置? 谢谢

【问题讨论】:

你可以尝试设置@JoinColumn(name = "product_id", nullable = false) 看看会发生什么? @SimonMartinelli 我收到此错误Column 'product_id' cannot be null 并抛出此异常could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement 【参考方案1】:

问题是,在 JSON 反序列化期间,未设置从 Variant 到 Product 的反向引用。

你定义

@OneToMany(mappedBy = "product", cascade = [CascadeType.ALL])
@JsonBackReference
var variants: MutableList<Variant> = mutableListOf()

mappedBy 表示后向引用是拥有方,因此负责设置外键。

你有两个选择:

    在保存产品之前在 Variant 中设置产品参考

    或者您从 Variant 中删除对 Product 的反向引用,并从变体集合中删除 mappedBy = "product"。

【讨论】:

以上是关于JPA @OneToMany 不保存父 ID的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data JPA:保存嵌套的 OneToMany 子级(具有级联)返回 NULL 父级外部对象

JPA OneToMany 不删除孩子

Play 2.3.4 Java - JPA oneToMany 不保存外键。请检查哪里出错了

在JPA双向@OnetoMany关系中,当我更新父实体时,子实体在数据库中被删除

具有父复合 pk 的 JPA OneToMany 是子主键派生实体问题的一部分

JPA:如果孩子有嵌入式ID,如何级联保存实体?