如何在一对多关系弹簧靴中多边添加值

时间:2019-04-10 06:49:39

标签: java hibernate spring-boot

我有商家和地址表。一个商人可以有多个地址,一个地址可以有一个商人(一对多的关系)。当用地址添加商人值时,我得到了这个错误。如何解决这个错误? 这是错误。

{
    "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;
    }

3 个答案:

答案 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;
    }

这很好用。