Parent @OneToMany 映射 JPA 中的 ID 为空
Parent Id null in @OneToMany mapping JPA
我在 Parent Child 关系中使用 javax.persistence.OneToMany 关系。 parent Id 为空,我已经通读了 Whosebug 中所有相关的 post,但没有得到任何线索我错过了什么。
根据提供的序列,所有相应的 PK 都在 Parent 和 Child table 中填充,但 FK 在 Child 中设置为空table
Parent Class:
@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<>();
Child Class:
@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;
服务Class:
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
不知道 parent,只有 parent 知道他的 children。
解决这个很容易,你必须在 child 中设置 parent 引用。
diversityTemplateAttribute.setDiversityTemplate(diversityTemplate);
或者您可以将此逻辑放入 DiversityTemplate
中的方法中,该方法会自动将属性添加到列表中 + 设置反向引用。
我知道为时已晚,但你也可以...
Parent Class:
@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, fetch = FetchType.LAZY)
@JoinColumn(name = "DIVERSITY_TEMPLATE_ID")
private List<DiversityTemplateAttribute> attributes = new ArrayList<>();
Child Class:
@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)
private DiversityTemplate diversityTemplate;
服务Class:
diversityTemplateRepository.save(diversityTemplate);
This way you DON'T NEED TO DO PARENT ENTRY IN EACH CHILD. it will do
by itself. you just need to save parent that's it.
快速完成我所做的步骤。
- Removed mappedBy from Parent.
- Added @JoinCollumn foreign key in Parent
- Removed @JoinCollumn from Child.
希望对您有所帮助。
@JsonManagedReference
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "DIVERSITY_TEMPLATE_ID")
private List<DiversityTemplateAttribute> attributes = new ArrayList<>();
.
.
.
.
@JsonBackRefrence
@ManyToOne(fetch = FetchType.LAZY)
private DiversityTemplate diversityTemplate;
这些 JsonManagedReference 和 JsonBackReference 由 jackson 库提供,让 JPA 知道它 class 它应该序列化以及它不应该序列化......这样我们就可以避免无限递归......更多关于这个在 here!
我在 Parent Child 关系中使用 javax.persistence.OneToMany 关系。 parent Id 为空,我已经通读了 Whosebug 中所有相关的 post,但没有得到任何线索我错过了什么。 根据提供的序列,所有相应的 PK 都在 Parent 和 Child table 中填充,但 FK 在 Child 中设置为空table
Parent Class:
@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<>();
Child Class:
@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;
服务Class:
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
不知道 parent,只有 parent 知道他的 children。
解决这个很容易,你必须在 child 中设置 parent 引用。
diversityTemplateAttribute.setDiversityTemplate(diversityTemplate);
或者您可以将此逻辑放入 DiversityTemplate
中的方法中,该方法会自动将属性添加到列表中 + 设置反向引用。
我知道为时已晚,但你也可以...
Parent Class:
@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, fetch = FetchType.LAZY)
@JoinColumn(name = "DIVERSITY_TEMPLATE_ID")
private List<DiversityTemplateAttribute> attributes = new ArrayList<>();
Child Class:
@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)
private DiversityTemplate diversityTemplate;
服务Class:
diversityTemplateRepository.save(diversityTemplate);
This way you DON'T NEED TO DO PARENT ENTRY IN EACH CHILD. it will do by itself. you just need to save parent that's it.
快速完成我所做的步骤。
- Removed mappedBy from Parent.
- Added @JoinCollumn foreign key in Parent
- Removed @JoinCollumn from Child.
希望对您有所帮助。
@JsonManagedReference
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "DIVERSITY_TEMPLATE_ID")
private List<DiversityTemplateAttribute> attributes = new ArrayList<>();
.
.
.
.
@JsonBackRefrence
@ManyToOne(fetch = FetchType.LAZY)
private DiversityTemplate diversityTemplate;
这些 JsonManagedReference 和 JsonBackReference 由 jackson 库提供,让 JPA 知道它 class 它应该序列化以及它不应该序列化......这样我们就可以避免无限递归......更多关于这个在 here!