java - @OneToMany 映射 JPA 中的父 ID 为空

标签 java hibernate jpa persistence one-to-many

我在父子关系中使用 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/

相关文章:

java - JPA 存储库 - 改进 findAll() 性能

java - Jlist 未显示/出现在小程序中

java - 如何使用 JPA Stream<GroupJson> 和整个数据库?

Spring Boot + Hibernate Multi-Tenancy : @Transactional not working

java - 如何使用 Hibernate/Spring boot 将 JSON 文件作为 JSON 数据类型存储在 mysql 中?

java - 在 Spring 4 JPA Hibernate 5 中使用 @NamedStoredProcedureQuery 的过程模式

java - 在多线程 RMI 架构中使用 JPA

java - Hibernate @SqlInsert 注释从 bean 中获取空值而不是值

java - "onRadioButtonClicked"方法不适用于由 "onCreate"方法实现的单选按钮

java - 生成的 GraphQL 类实现查询接口(interface)而不是订阅接口(interface)