gpt4 book ai didi

java - Hibernate 保存新的一对一实体映射

转载 作者:行者123 更新时间:2023-12-01 12:49:10 24 4
gpt4 key购买 nike

我在尝试将两个新实体保留在数据库上并在它们之间建立映射时遇到问题

父实体:

@OneToOne(cascade = CascadeType.MERGE, mappedBy = "conflictOfInterest") 
@XmlTransient
@JsonIgnore
@Getter
@Setter
private RequestForCorrection requestForCorrection;

子实体:

@OneToOne()
@JoinColumn(name = "conflict_of_interest_id")
@JsonIgnore
@XmlTransient
@Getter
@Setter
private ConflictOfInterest conflictOfInterest;

当 RequestForCorrection 和 ConflictOfInterest 的 ID 为 null 并且我有

requestForCorrection.setConflictOfInterest(conflictOfInterest)
save(requestForCorrection)

Hibernate 抛出异常

Caused by: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing: com.greenvalley.etendering.domain.RequestForCorrection.conflictOfInterest -> com.greenvalley.etendering.domain.ConflictOfInterest
at org.hibernate.engine.spi.CascadingAction$8.noCascade(CascadingAction.java:380) ~[hibernate-core-4.2.7.Final.jar:4.2.7.Final]

我尝试将父级的级联注释更改为 ALL 和 PERSIST,但没有成功。我希望节省级联费用,所以

save(conflictOfInterest)
requestForCorrection.setConflictOfInterest(conflictOfInterest)
save(requestForCorrection)

我认为没有有效的解决方案

最佳答案

当保存父表 hibernate 时,它试图创建具有对父表的新引用的子表。我建议你做2点改变。

首先,如果您希望父级中的所有更改都传递到子级,请将 CascadeType 从 Merge 更改为 ALL

其次,向 Child 添加 nullable = false 以强制在插入中添加 fk。

@OneToOne(cascade = CascadeType.ALL, mappedBy = "conflictOfInterest")
@XmlTransient
@JsonIgnore
@Getter
@Setter
private RequestForCorrection requestForCorrection;

@OneToOne
@JoinColumn(name = "conflict_of_interest_id", nullable = false)
@JsonIgnore
@Getter
@Setter
private ConflictOfInterest conflictOfInterest;

关于java - Hibernate 保存新的一对一实体映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24382506/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com