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 父级外部对象
Play 2.3.4 Java - JPA oneToMany 不保存外键。请检查哪里出错了
在JPA双向@OnetoMany关系中,当我更新父实体时,子实体在数据库中被删除