我有商家和地址表。一个商人可以有多个地址,一个地址可以有一个商人(一对多的关系)。当用地址添加商人值时,我得到了这个错误。如何解决这个错误? 这是错误。
{
"timestamp": 1554878673504,
"status": 500,
"error": "Internal Server Error",
"message": "could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement",
"path": "/merchant-service/save-merchant"
}
这是我的输入值:
{
"idNo": null,
"idType": null,
"emailId": "email@gmail.com",
"name": null,
"status": true,
"createdBy": null,
"modifiedBy": null,
"createdDate": null,
"modifiedDate": null,
"contacts": [
{"contactNo": "0766601122"}],
"addresses": [
{"line1": "manipay"},
{"line1": "suthumalai"}
]
}
这是我在商家模型中的代码:
@OneToMany(fetch = FetchType.LAZY,cascade = {CascadeType.ALL}, mappedBy = "merchant")
private Set<Address> addresses = new HashSet<Address>(
0);
这是我在地址模型中的代码:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "merchant_id", nullable = false)
// @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
// @Getter(onMethod = @__( @JsonIgnore))
// @Setter
private Merchant merchant;
这是我的服务
public Merchant saveMerchant(Merchant merchant) {
merchant = merchantRepository.save(merchant);
return merchant;
}
答案 0 :(得分:0)
它说您有一个违反约束的错误,这意味着您可能已将实体中的任何变量设置为非null,并且您试图保存一个null值。
答案 1 :(得分:0)
在您的商人模型中,您为地址属性设置了5
。这意味着在这种情况下,如果您要保留具有某些地址的Merchant对象,休眠将检查这些地址是否已经存在;如果没有,它将在之前创建它们。但是在地址模型中,您将cascade = {CascadeType.ALL}
设置为商家属性,这意味着如果没有现有的商家,就无法保留地址对象。然后,当休眠尝试持久化Merchant并找到尚未持久化的Address时,它会尝试先持久化此Address,它还会找到一个null Merchant对象,然后抛出此异常nullabel = false
。
您必须选择以下建议之一:
在地址模型上的商家属性中删除org.hibernate.exception.ConstraintViolationException
约束。如果执行此操作,则无需商家即可保留该地址。然后,当您坚持执行时,商家休眠将更新地址。
在商家模型的地址属性中将nullable = false
更改为除PERSIST以外的所有其他级联。如果这样做,则应先保留Merchant,然后再保留与现有Merchant的地址。
答案 2 :(得分:0)
在Merchent表中:
@OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}, mappedBy = "merchant")
private Set<Address> addresses = new HashSet<Address>(
0);
在“地址”表中:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "merchant_id")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@Getter(onMethod = @__( @JsonIgnore))
@Setter
private Merchant merchant;
服务中:
public Merchant saveMerchant(Merchant merchant) {
merchant = merchantRepository.save(merchant);
Merchant finalMerchant = merchant;
merchant.getAddresses().forEach(address -> {
address.setMerchant(finalMerchant);
addressRepository.save(address);
});
return merchant;
}
这很好用。