@OneToMany映射JPA中的父ID为null

时间:2017-04-11 22:45:14

标签: java hibernate jpa persistence one-to-many

我在父子关系中使用javax.persistence.OneToMany关系。父ID是空的,我已经阅读了Stackoverflow中的所有相关帖子,但没有得到任何线索我错过了什么。 所有相应的PK都会在Parent&根据序列提供的子表,但在子表中将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,
  }]
}

请建议。

2 个答案:

答案 0 :(得分:4)

通常空的FK列来自设置关系的一侧。

我想你有以下

DiversityTemplate diversityTemplate = ...
diversityTemplate.getAttributes().add(...)
...
diversityTemplateRepository.save(diversityTemplate);

这是错误的,因为DiversityTemplateAttribute不了解父母,只有父母知道他的孩子。

解决这个问题很简单,您必须在子项中设置父引用。

diversityTemplateAttribute.setDiversityTemplate(diversityTemplate);

或者您可以将此逻辑放入DiversityTemplate中的方法中,该方法会自动将属性添加到List +中设置反向引用。

答案 1 :(得分:0)

我知道为时已晚,但您也可以这样做...

父级:

@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<>();

儿童班:

@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;

服务等级:

diversityTemplateRepository.save(diversityTemplate);
  

通过这种方式,您无需在每个孩子中进行父母报名。它会做   通过它自己。您只需要保存父项即可。

快速执行我的操作。

  
      
  1. 已从Parent移除mapdBy。
  2.   
  3. 在父级中添加了@JoinCollumn外键
  4.   
  5. 从Child中删除了@JoinCollumn。
  6.   

希望有帮助。