【问题标题】:Unable to add child entity - JPA OneToMany relationship无法添加子实体 - JPA OneToMany 关系
【发布时间】:2020-07-12 07:08:06
【问题描述】:

我一直在尝试向数据库中添加一个实体,该实体与另一个实体具有 OneToMany 关系,但是当我插入该实体时,它说无法插入 id,因为它为空。

我已经像这样映射父子类:

@OneToMany(mappedBy = "directory", cascade = CascadeType.ALL)

private List<DirectoryRemarksEntity> remarks;

子实体:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "DIRECTORY_ID")
@JsonIgnore
private DirectoryTableEntity directory;

我的 json 看起来像这样:

 {
  "state": {
    "id": 2,
    "nameEn": "Dubai",
    "code": "DXB",
    "nameAr": "دبي"
  },
  "segment": {
    "id": 5,
    "name": "Government",
    "alias": "Gov"
  },
  "contactType": {
    "id": 5,
    "name": "FAX"
  },
  "remarks": [
    {
      "remarkValueAR": "EN Remarks",
      "remarkValueEN": "AR RemarksEN ",
      "remarkType": {
        "id": 4,
        "name": "legacy_modifieddate"
      }
    }
  ],
  "isTelSecret": 1,
  "isPublishElectroniceMedia": 0,
  "isTelPublishDa": 1,
  "isPrintARA": 0,
  "isPrintENG": 0,
  "establishmentNameEn": "Establishment Name",
  "establishmentNameAr": "",
  "establishmentSubNameEn": "Subname",
  "establishmentSubNameAr": "Arabicname",
  "contactCountryCode": "92",
  "contactNumber": "3042501110",
  "streetAR": "",
  "streetEN": "",
  "houseNumber": "",
  "flatNo": "",
  "buildingAR": "",
  "buildingEN": "",
  "proffesionAR": "",
  "proffesionEN": "",
  "latitude": "",
  "longitude": "",
  "accountProductCode": "00",
  "subSegment": "",
  "companyNameAr": "",
  "companyNameEn": "",
  "email": "",
  "url": "",
  "ISUrl": "",
  "ticketsFeesEN": "",
  "ticketsFeesAR": "",
  "timingsAR": "",
  "timingsEN": "",
  "streetEn": "SZR"
}

这是hibernate抛出的错误:

错误消息 = ORA-01400:无法将 NULL 插入 ("DQISAPPS"."DIRECTORY_REMARKS"."DIRECTORY_ID")

在 oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:498)

这是我的休息控制器:

@PostMapping("/")
public ResponseEntity<Response<DirectoryTableEntity>> save(@RequestBody DirectoryTableEntity directory){
    return new ResponseEntity<>(
            new Response<>(directoryService.save(directory), new Meta(SUCCESS_MESSAGE, HttpStatus.OK.value())),
            HttpStatus.OK);
    }

这是我的服务:

    @Override
public DirectoryTableEntity save(DirectoryTableEntity directory) {
    // TODO Auto-generated method stub
    String user  = authService.getUsername();
    directory.setStatusId(1);
    directory.setCreatedBy(user);
    directory.setLastModifiedBy(user);
    return directoryTableRepository.save(directory);
}

谁能告诉我这里缺少什么?

【问题讨论】:

  • 你能添加你的rest控制器接受这个json和调用存储库存储的方法吗?
  • 我已经添加了其余控制器和服务。

标签: java spring hibernate jpa


【解决方案1】:

DirectoryRemarksEntity 和 DirectoryTableEntity 之间的关系是双向的。在JPA/Hibernate 中,您必须明确设置两边。

当 DirectoryTableEntity 是从 json 创建时,directory.getRemarks() 将具有 DirectoryRemarksEntity 但 remark.getDirectory() 将是 null。

所以更新你的服务方法以包含directory.getRemarks().forEach(remark -&gt; remark.setDirectory(directory));

@Override
public DirectoryTableEntity save(DirectoryTableEntity directory) {
    // TODO Auto-generated method stub
    String user  = authService.getUsername();
    directory.setStatusId(1);
    directory.setCreatedBy(user);
    directory.setLastModifiedBy(user);
    directory.getRemarks().forEach(remark -> remark.setDirectory(directory));
    return directoryTableRepository.save(directory);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    相关资源
    最近更新 更多