【发布时间】:2020-04-15 16:11:10
【问题描述】:
我的模型有一个典型的父子关系,它是 JPA 建模的,由单向 @OneToMany 关系:Parent 有 0..n 个 Child 实例(即 List<Child>)。
尝试创建并保留一个 Entity 和一个依赖 Property,如下所示:
val a_parent = Parent(
id = "I_am_a_parent",
children = listOf(Child(kind="childish"))
)
parentRepository.save(a_parent)
令人惊讶的结果
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [parent_id]; nested exception is
...
Caused by: org.postgresql.util.PSQLException:
ERROR: null value in column "parent_id" violates not-null constraint
Detail: Failing row contains (22, childish, null).
在线parentRepository.save(a_parent)。
显然,JPA 不会在子级上设置父级的 id(列 children.parent_id)。
为什么不呢?以及如何告诉它这样做?
Parent和Child的代码如下
@Entity
@Table(name = "parents")
data class Parent (
@Id
@Column(name = "id")
var id: String? = null,
@OneToMany(cascade = [CascadeType.ALL], orphanRemoval = true)
@JoinColumn(name = "parent_id")
var properties: List<Child> = listOf()
)
@Entity
@Table(name = "children")
data class Child (
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
var id: Int? = null,
@Column(name = "kind")
var kind: String? = null
)
【问题讨论】:
-
为什么要使用可以为空的
@Id列? -
@AlexRudenko 该列不可为空,属性可以。因为 JPA 需要一个默认的无参数构造函数。 Kotlin 从默认值生成无参数构造函数。我可以将 0 或 -1 作为默认参数,但我更喜欢
null,因为null不是 id 的有效值。 - 但是这个话题与问题的错误和问题无关。
标签: java jpa kotlin one-to-many hibernate-onetomany