首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@OneToMany映射JPA中的父Id null

@OneToMany映射JPA中的父Id null
EN

Stack Overflow用户
提问于 2017-04-11 22:45:13
回答 3查看 9.2K关注 0票数 10

我在父子关系中使用javax.persistence.OneToMany关系。父Id以null形式出现,我已经阅读了Stackoverflow中所有相关的帖子,但没有得到任何提示。按照所提供的顺序在父表和子表中填充所有对应的PKs,但在子表中,FK设置为空。

父类:

代码语言:javascript
复制
@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<>();

儿童班:

代码语言:javascript
复制
@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;

服务类:

代码语言:javascript
复制
 diversityTemplateRepository.save(diversityTemplate);

样本json

代码语言:javascript
复制
{
  "diversityTemplateId": 0,
  "attributes": [{
    "diversityTemplateId": 0,
    "diversityTemplateAttributeId": 0,
  }, {
    "diversityTemplateId": 0,
    "diversityTemplateAttributeId": 0,
  }]
}

请建议一下。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-12 06:29:22

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

我想你有以下几点

代码语言:javascript
复制
DiversityTemplate diversityTemplate = ...
diversityTemplate.getAttributes().add(...)
...
diversityTemplateRepository.save(diversityTemplate);

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

解决这个问题很容易,您必须在孩子中设置父引用。

代码语言:javascript
复制
diversityTemplateAttribute.setDiversityTemplate(diversityTemplate);

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

票数 10
EN

Stack Overflow用户

发布于 2019-04-12 07:24:31

我知道为时已晚,但你也可以.

父类:

代码语言:javascript
复制
@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<>();

儿童班:

代码语言:javascript
复制
@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;

服务类:

代码语言:javascript
复制
diversityTemplateRepository.save(diversityTemplate);

这样,您的就不需要在每个子中做父条目了。它自己就行了。你只需要拯救父母就好了。

快速步进我所做的事情。

  1. 从父级删除mappedBy。
  2. 在父级中添加@JoinCollumn外键
  3. 从儿童中删除@JoinCollumn。

希望能帮上忙。

票数 9
EN

Stack Overflow用户

发布于 2022-02-16 07:43:42

代码语言:javascript
复制
@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由杰克逊库提供,以便让JPA知道它应该序列化哪个类,以及它不应该在哪个类上序列化。这样我们才能避免无限递归..。更多关于这个在这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43357413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档