我在父子关系中使用 javax.persistence.OneToMany 关系。父 ID 为空,我已经通读了 Stackoverflow 中的所有相关帖子,但没有得到任何线索我遗漏了什么。 所有对应的 PK 都根据提供的序列填充到父表和子表中,但 FK 在子表中设置为空
父类:
@Entity
@Table(name = "DIVERSITY_TEMPLATE")
public class DiversityTemplate implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name = "DIVERSITY_TEMPLATE_ID", sequenceName = "DIVERSITY_TEMPLATE_ID", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "DIVERSITY_TEMPLATE_ID")
@Column(name = "DIVERSITY_TEMPLATE_ID")
private Integer diversityTemplateId;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "diversityTemplate", fetch = FetchType.LAZY)
private List<DiversityTemplateAttribute> attributes = new ArrayList<>();
子类:
@Entity
@Table(name = "DIVERSITY_TEMPLATE_ATTRIBUTE")
@TypeName("DiversityTemplateAttribute")
public class DiversityTemplateAttribute implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name = "DIVERSITY_TEMPLATE_ATTR_ID", sequenceName = "DIVERSITY_TEMPLATE_ATTR_ID", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "DIVERSITY_TEMPLATE_ATTR_ID")
@Column(name = "DIVERSITY_TEMPLATE_ATTR_ID")
private Integer diversityTemplateAttributeId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "DIVERSITY_TEMPLATE_ID", nullable=false, referencedColumnName = "DIVERSITY_TEMPLATE_ID")
private DiversityTemplate diversityTemplate;
服务等级:
diversityTemplateRepository.save(diversityTemplate);
示例 json
{
"diversityTemplateId": 0,
"attributes": [{
"diversityTemplateId": 0,
"diversityTemplateAttributeId": 0,
}, {
"diversityTemplateId": 0,
"diversityTemplateAttributeId": 0,
}]
}
请提出建议。
最佳答案
通常空的 FK 列来自仅设置关系的一侧。
我想你有以下内容
DiversityTemplate diversityTemplate = ...
diversityTemplate.getAttributes().add(...)
...
diversityTemplateRepository.save(diversityTemplate);
这是错误的,因为 DiversityTemplateAttribute
不知道父项,只有父项知道他的子项。
解决这个很简单,你必须在 child 中设置父引用。
diversityTemplateAttribute.setDiversityTemplate(diversityTemplate);
或者您可以将此逻辑放入 DiversityTemplate
中的一个方法中,该方法会自动将属性添加到列表中 + 设置反向引用。
关于java - @OneToMany 映射 JPA 中的父 ID 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43357413/