【发布时间】:2020-04-04 12:35:35
【问题描述】:
我有类似的东西:
@Entity
@Table(name = "claim", schema = "test")
public class Claim implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "idClaim", unique = true, nullable = false)
private Integer idClaim;
@OneToOne(mappedBy = "claim", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JsonManagedReference
private ClaimReturnInfo claimReturnInfo;
@Column(name = "notes")
private String notes;
// Getters and setters
}
@Entity
@Table(name = "claim_returninfo", schema = "test")
public class ClaimReturnInfo implements Serializable {
@Id
@Column(name = "Claim_idClaim")
private Integer id;
@MapsId("Claim_idClaim")
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "Claim_idClaim")
@JsonBackReference
private Claim claim;
@Column(name = "description")
private String description;
// Getters and setters
}
ClaimReturnInfo Id 不是自动生成的,因为我们想从其父级 (Claim) 传播 Id。我们无法自动执行此操作,并且出现此错误:当在 ClaimReturnInfo 中执行 'cascade' 时,必须在调用 save() 之前手动分配此类的 id。
是否可以将 Claim Id 映射到 ClaimReturnInfo Id 或者我们应该手动执行此操作?
即使我们在 claimReturnInfo 上手动设置此 ID 并且我们可以执行更新,但在尝试创建新的 Claim 时仍然会出现此错误:
// POST -> claimRepository.save() -> Error
{
"notes": "Some test notes on a new claim",
"claimReturnInfo": {
"description": "Test description for a new claimReturnInfo"
}
}
在ServiceImplementation中:
@Override
@Transactional
public Claim save(Claim claim) throws Exception {
if(null != claim.getClaimReturnInfo()) {
claim.getClaimReturnInfo().setId(claim.getIdClaim());
}
Claim claimSaved = claimRepository.save(claim);
return claimSaved;
}
【问题讨论】:
-
是的,你需要先保存
claim -
当然,如果我先保存
claim并手动将此 ID 设置为其子项,则它可以工作。我要求一种自动行为。 -
你在使用
Spring Rest Repositories吗?请在失败的地方添加代码。 \ -
你的意思是
Spring data repository?是的,我正在使用JpaRepository。正如我在问题中所说,失败的代码只是.save。 -
我认为这篇文章应该对stackoverflow.com/questions/57116212/…有所帮助。您需要在父实体中添加setter方法,以便它可以为您绑定子实体。
标签: java hibernate spring-boot jpa spring-data-jpa