Java 休眠保存新的一对一实体映射

Java 休眠保存新的一对一实体映射,java,spring,hibernate,jakarta-ee,Java,Spring,Hibernate,Jakarta Ee,我在试图用数据库中的两个新实体之间的映射来持久化它们时遇到了一个问题 母公司: @OneToOne(cascade = CascadeType.MERGE, mappedBy = "conflictOfInterest") @XmlTransient @JsonIgnore @Getter @Setter private RequestForCorrection requestForCorrection; 子实体: @OneToOne() @JoinColumn(name = "conf

我在试图用数据库中的两个新实体之间的映射来持久化它们时遇到了一个问题

母公司:

@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;
当请求更正和利益冲突的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并保持,但没有成功。 我想在cascade上省钱,所以

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

当保存父表Hibernate时,我不考虑一个有效的解决方案

。它试图创建一个子表,该子表对父表有新的引用。我建议你做两个改变

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

其次,将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;

我认为连接列注释可能位于requestForCorrection字段上,这可能取决于
save
操作的实际功能。你能把它添加到问题中吗?@Tony如果我们更改ForeignKey,我们就有SQL foreign key exception。@我描述的awb必须在cascade上持久化父级和子级,你还需要知道什么?它的内部表示可能会有帮助。否则,为什么不直接调用entityManager.persist()?