【问题标题】:Parent id is not saved in child table Spring JPA2 @OneToMany relation父ID未保存在子表Spring JPA2 @OneToMany关系中
【发布时间】:2019-07-08 04:14:55
【问题描述】:

我有如下所示的 json,它来自第三方服务,我通过开放的 feign 客户端获取它。我正在尝试使用 Spring JPA2 将这些详细信息保存到我的 MySQL 数据库中。

[
  {
    "request_id": 111,
    "name": "ABC",
    "groups": [
      {
        "id": 21,
        "group": "grp_A"
      },
      {
        "id": 22,
        "group": "grp_B"
      }
    ]
  },
  {
    "request_id": 222,
    "name": "ABC",
    "groups": [
      {
        "id": 23,
        "group": "grp_C"
      }
    ]
  },
  {
    "request_id": 333,
    "name": "ABC",
    "groups": [
      {
        "id": 24,
        "group": "grp_A"
      }
    ]
  },
  {
    "request_id": 444,
    "name": "ABC",
    "groups": [
      {
        "id": 25,
        "group": "grp_C"
      }
    ]
  },
  {
    "request_id": 555,
    "name": "ABC",
    "groups": []
  }
]

我已经为上面的 json 编写了映射,如下所示

Requests.java

@Entity
@Table(name = "requests")
@JsonIgnoreProperties(ignoreUnknown = true)
public class Requests {

    @Id
    @Column(name = "request_id")
    private String id;

    @Column(name = "name")
    private String name;

    @OneToMany(mappedBy = "id", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Set<Groups> groups = Sets.newHashSet();

    // getters and setters
}

Groups.java

@Entity
@Table(name = "groups")
@JsonIgnoreProperties(ignoreUnknown = true)
public class Groups{

    @Id
    @Column(name = "id")
    private String id;

    @Column(name = "group")
    private String group;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "request_id")
    private Requests requests;

    // getters and setters
}

现在在我的服务类中,我已经完成了如下所示的操作

List<Requests> allRequests = requestFeignClient.getRequests();
requestRepository.saveAll(allRequests);

除了 request_id 之外,所有详细信息都保存到数据库中,如下所示。我的预期组表也如下所示

谁能告诉我为什么 request_id 没有得到保存。

【问题讨论】:

    标签: java spring-data-jpa jpa-2.0 spring-cloud-feign


    【解决方案1】:

    尝试替换这个:

    @OneToMany(mappedBy = "id", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    

    有了这个:

    @OneToMany(mappedBy = "requests", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    

    【讨论】:

    • 我试过了,但我得到了这个异常Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: com.test.model.Groups.request_id in com.test.model.Requests.groups
    • 尝试“requests”而不是“request_id”
    • 父引用也需要在所有子节点上设置。仅仅用 Jackson 反序列化 json 是不可能的。我会引入 DTO,或者您需要在保存之前迭代子级并在每个中设置父级。
    猜你喜欢
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 2019-03-24
    • 2020-06-17
    • 2019-01-12
    • 2020-11-25
    • 1970-01-01
    • 2018-11-06
    相关资源
    最近更新 更多