Java 如何告知JPA管理从属实体?

Java 如何告知JPA管理从属实体?,java,jpa,kotlin,one-to-many,hibernate-onetomany,Java,Jpa,Kotlin,One To Many,Hibernate Onetomany,我的模型有一个典型的父子关系,它是由一个单向的@OneToMany关系建立的JPA模型: 父级具有0..n个子级实例(即列表) 正在尝试创建并持久化具有一个相关属性的实体,如下所示: val a_parent = Parent( id = "I_am_a_parent", children = listOf(Child(kind="childish")) ) parentRepository.save(a_parent) 令人惊讶的结果 org.springfr

我的模型有一个典型的父子关系,它是由一个单向的
@OneToMany
关系建立的JPA模型:
父级
具有0..n个
子级
实例(即
列表

正在尝试创建并持久化具有一个相关属性的
实体
,如下所示:

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\u id

为什么不呢?如何告诉它这样做?

父项
子项
的代码如下

@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()
)

单向OneToMany可能必须以这种方式实现():

数据类父类(
//...
@OneToMany(级联=[CascadeType.ALL],孤立删除=真)
@JoinColumn(name=“parent\u id”,nullable=false)
变量属性:List=listOf()
)

如果数据库列
parent\u id
不可为空,请注意
nullable=false

为什么要使用nullable
@id
列?@AlexRudenko该列不可为空,属性为空。因为JPA需要一个默认的无参数构造函数。Kotlin根据默认值生成无参数构造函数。我可以将0或-1作为默认参数,但我更喜欢
null
,因为
null
不是id的有效值。-但此主题与错误和问题无关。您提出的是双向关系。有许多不同的方法来实现父子关系。我需要一个单向关系。对不起,我忽略了这个要求。因此,您的实现似乎非常有效-如参考文献中所述,但是在这种情况下,
parent\u id
列必须可以为空:-\这是正确的提示。列
parent\u id
不需要为空。但如果不是,则需要我的
@JoinColumn
中的
nullable=false
(如您的答案所示)。所以,请随意根据单向关系编辑您的答案,我将投票支持并接受它。是的。类似问题
@Entity
@Table(name = "children")
data class Child (
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        var id: Int? = null,

        @Column(name = "kind")
        var kind: String? = null
)