外键可能未正确映射,因此我在创建数据库中数据的REST API中遇到错误

问题描述

我有两个表:

societe (
   id SERIAL PRIMARY KEY,...,fk_adresse int NOT NULL
);

(fk_adresse是外键)

一个表是

bureau (
    fk_societe INT PRIMARY KEY NOT NULL,fk_convention INT NOT NULL,....
 );

fk_societe既是“局”表的主键,又是指向“ societe”表的外键,而fk_convention是外键。

我对局的Java映射是:

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "fk_societe",nullable = false)
private Integer fkSociete;

@OnetoOne(fetch = FetchType.LAZY,optional = true,cascade = CascadeType.ALL)
@JoinColumns({ @JoinColumn(name = "fk_societe",referencedColumnName = "id") })
private Societe societe;

....

@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "fk_convention",referencedColumnName = "id")
private Convention convention;

....

我的控制器是

@RequestMapping(value = "/create",method = RequestMethod.POST,consumes = "application/x-www-form-urlencoded;application/json")
public void createBureau(Bureau bureau){
    bureauRepository.save(bureau);
}

@GetMapping("/bureaux")
public List<Bureau> getAllBureaux() {
    return bureauRepository.findAll();
}

//recherche de bureau
@GetMapping("/{id}")
public ResponseEntity<Bureau> getBureauById(@PathVariable(value = "id") Integer id)
    throws ResourceNotFoundException {
        
    Bureau bureau = bureauRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("Bureau not found");
    return ResponseEntity.ok().body(bureau);                                                        
}

搜索一个局和所有局的列表都可以,但是创建一个局是行不通的。在我的社交网站表中,我有一个ID为42的社交网站,因此我向Postman发送了创建(POST)请求,并带有以下数据:

fk_societe          42  
fk_devise            1
fk_langue           67
fk_convention        2
est_4_e_directive   true
est_transitoire     false

邮递员对我说有一个500错误,并且在我的控制台中我遇到以下错误

2020-10-16 11:50:07.115 ERROR 8368 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.sqlExceptionHelper   : ERREUR: une valeur NULL viole la contrainte NOT NULL de la colonne ½ fk_societe ╗ dans la relation ½ bureau ╗
DÚtailá: La ligne en Úchec contient (null,null,f,f).

翻译
ERROR: a NULL value violates the NOT NULL constraint of the fk_societe column in the bureau relationship
Details : the failing line contains (null,f).

也许我的外键没有正确映射...

解决方法

尝试通过以下方式更正局的映射:

@Id
@Column(name = "fk_societe",nullable = false)
private Integer fkSociete;

@MapsId
@OneToOne(fetch = FetchType.LAZY,optional = false,cascade = CascadeType.ALL)
@JoinColumn(name = "fk_societe")
private Societe societe;

当您使用与实体ID相同的列fk_societe和另一个实体的外键时,应在此处使用@MapsId annotation