首页 > 解决方案 > 无法添加子实体 - JPA OneToMany 关系

问题描述

我一直在尝试向数据库添加一个实体,该实体与另一个实体具有 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);
}

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

标签: javaspringhibernatejpa

解决方案


DirectoryRemarksEntity和之间的关系DirectoryTableEntity 是双向的。在JPA/Hibernate你必须明确设置双方。

DirectoryTableEntity从 json 创建时,directory.getRemarks()将拥有DirectoryRemarksEntityremark.getDirectory()将是null.

所以更新你的服务方法以包括directory.getRemarks().forEach(remark -> 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);
}

推荐阅读