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
)