java - 从字段中自动休眠地图 ID
问题描述
我有类似的东西:
@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 中执行“级联”时,必须在调用 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;
}
解决方案
我尝试使用以下映射,从您的评论中可以看出 Json 对象已正确填充。我注意到注释@MapsId 是罪魁祸首。如果您查看@MapsId 注释的文档,它会说
块引用
关系属性对应的复合键 * 中的属性名称。如果没有 * 提供,则关系映射实体的主 * 键
块引用
如果您将@MapsId("Claim_idClaim") 更改为@MapsId,它将开始持久化您的实体。
import javax.persistence.*;
@Entity
@Table(name = "CLAIM")
public class Claim {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "idClaim", unique = true, nullable = false)
private Long idClaim;
@Column(name = "notes")
private String notes;
@OneToOne(mappedBy = "claim", cascade = CascadeType.ALL, optional = false)
private ClaimReturnInfo claimReturnInfo;
public Long getIdClaim() {
return idClaim;
}
public String getNotes() {
return notes;
}
public void setNotes(String notes) {
this.notes = notes;
}
public ClaimReturnInfo getClaimReturnInfo() {
return claimReturnInfo;
}
public void setClaimReturnInfo(ClaimReturnInfo claimReturnInfo) {
if (claimReturnInfo == null) {
if (this.claimReturnInfo != null) {
this.claimReturnInfo.setClaim(null);
}
} else {
claimReturnInfo.setClaim(this);
}
this.claimReturnInfo = claimReturnInfo;
}
}
package com.hiber.hiberelations;
import javax.persistence.*;
@Entity
@Table(name = "CLAIM_RETURN_INFO")
public class ClaimReturnInfo {
@Id
@Column(name = "Claim_idClaim")
private Long childId;
@Column(name = "DESCRIPTION")
private String description;
@MapsId
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "Claim_idClaim")
private Claim claim;
public Long getChildId() {
return childId;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Claim getClaim() {
return this.claim;
}
public void setClaim(Claim claim) {
this.claim = claim;
}
}
推荐阅读
- javascript - 获取固定 div 容器内元素的绝对位置
- javascript - Django admin - 使图像出现在 django 管理列表视图上
- r - R - 从单词列创建句子 ID
- javascript - 如何使用此 JSON 对象在 javascript 中构建此 JSON
- python - 对单个函数的重叠调用,希望每个函数在执行函数之前等待一秒钟,但不要强制所有人等待
- python - 以烧瓶形式(WTForm)在嵌套的 FieldList/FormField 中加载数据
- audio - 如何在 SwiftUI 中等待音频完成?
- vba - 将数据从 Access 365 导出到 IBM i-Series v7r1
- c++ - 如何将 IPropertyBag 持久化到磁盘
- ios - 如何从 Firebase 存储中的文档中获取项目并使用 SWIFT 将其添加到视图中