双向 OneToMany 上的"非空属性引用空值或瞬态值",希望休眠自动填充属性



给定以下实体

@Entity
@Table(name = "dispute_folder")
class DisputeFolderEntity {
@Id
var id: Long = 0L
@OneToMany(mappedBy = "disputeFolder", cascade = [CascadeType.ALL], orphanRemoval = true)
lateinit var postings: MutableList<DisputePostingEntity>
}
@Entity
@Table(name = "dispute_posting")
class DisputePostingEntity {
@Id
var id: Long = 0L
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "folder", nullable = false)
lateinit var disputeFolder: DisputeFolderEntity
}

我希望能够像这样保存文件夹(从业务角度来看,它拥有帖子),Hibernate/JPA正确地解决关系:

val posting = DisputePostingEntity().apply {
id = 12341L
}
val folder = DisputeFolderEntity().apply {
id = 1234L
postings = mutableListOf(posting)
}
entityManager.persist(folder)

hibernate会抛出PropertyValueException

org.hibernate.PropertyValueException: not-null property references a null or transient value:
com.example.jpatest.persistence.DisputePostingEntity.disputeFolder

如果在"owned"中设置引用,则持久化实体可以正常工作。但我觉得这不应该是处理这件事的方式?

val folder = DisputeFolderEntity().apply {
id = 1234L
}
val posting = DisputePostingEntity().apply {
id = 12341L
disputeFolder = folder
}
folder.postings = mutableListOf(posting)
entityManager.persist(folder)

我的实际用例是一个春季批处理作业,其中我读取一个大型XML文件,其中包含多个争议文件夹及其帖子(以及"拥有"的其他关系)。通过文件夹),并希望使用简单的JpaItemWriterBuilder<DisputeFolder>将它们写入我们的数据库。如果我能够通过单向属性设置(在所属文件夹上)来定义关系,而不是必须在关系的两边设置值,我将不胜感激。

Hibernate应该如何知道从所有可能的mappedBy关联中哪个可以推断出这样一个* to- 1可能与它相关的值?看,你映射这个的方式,实际上是相反的。您不必将帖子添加到帖子集合中,因为这与关联DisputeFolderEntity.postings无关,因为该关联由DisputePostingEntity中的disputeFolder属性映射。

如果你想的话,你可以用另一种方式来映射它,并在DisputePostingEntity.disputeFolder上使用insertable = false, updatable = false,但这开始看起来应该是一个可嵌入的

相关内容

最新更新