猿问

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

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


{

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

    }


牧羊人nacy
浏览 98回答 2
2回答

森栏

我是你的商家模型,你为地址属性设置的。这意味着在这种情况下,如果您想保留具有某些地址的 Merchant 对象,休眠将检查这些地址是否已存在;如果没有,它将在之前创建它们。但在地址模型中,您设置为商家属性,这意味着如果没有现有商家,则无法保留地址对象。然后,当休眠者尝试持久化商家并找到尚未持久化的地址时,它会尝试在此之前持久化此地址,它还会找到一个空 Merchant 对象,然后引发此异常。cascade = {CascadeType.ALL}nullabel = falseorg.hibernate.exception.ConstraintViolationException您必须选择以下建议之一:删除地址模型上商家属性中的约束。如果您这样做,地址将保留在没有商家的情况下。然后,当您坚持时,商家休眠将更新地址。nullable = false更改为除“商家模型的 PERSIST 地址”属性之外的所有其他级联。如果您这样做,您应该在自己之前保留商家,然后将地址保留在现有商家中。cascade = {CascadeType.ALL}

POPMUISE

在“商品”表中:&nbsp;&nbsp;@OneToMany(fetch&nbsp;=&nbsp;FetchType.LAZY,&nbsp;cascade&nbsp;=&nbsp;{CascadeType.MERGE},&nbsp;mappedBy&nbsp;=&nbsp;"merchant") &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Set<Address>&nbsp;addresses&nbsp;=&nbsp;new&nbsp;HashSet<Address>(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0);在地址表中:&nbsp;@ManyToOne(fetch&nbsp;=&nbsp;FetchType.LAZY) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@JoinColumn(name&nbsp;=&nbsp;"merchant_id") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@JsonIgnoreProperties({"hibernateLazyInitializer",&nbsp;"handler"}) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Getter(onMethod&nbsp;=&nbsp;@__(&nbsp;@JsonIgnore)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Setter &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Merchant&nbsp;merchant;使用中:public&nbsp;Merchant&nbsp;saveMerchant(Merchant&nbsp;merchant)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;merchant&nbsp;=&nbsp;merchantRepository.save(merchant);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Merchant&nbsp;finalMerchant&nbsp;=&nbsp;merchant; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;merchant.getAddresses().forEach(address&nbsp;->&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;address.setMerchant(finalMerchant); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addressRepository.save(address); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;merchant; &nbsp;&nbsp;&nbsp;&nbsp;}它完美地工作。
随时随地看视频慕课网APP

相关分类

Java
我要回答