与CascadeType复制

时间:2018-10-29 14:39:29

标签: java mysql jpa

我现在有点困惑。我有三个表:specialPrice,partner,product。

在特惠价格中,我可以存储将提供给选定合作伙伴的产品折扣。因此它只有三列。合作伙伴和产品表及其行从specialPrice表中引用。

这三个表在我的Java应用程序中也表示为实体。这是我的问题:如果我要存储一个specialPrice,则会出现以下异常:

Caused by: java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: 0.

该错误消息很有帮助,我必须使用CascadeType,好的。但是,如果我使用CascadeType.ALL,将创建specialPrice(因此不再创建java.lang.IllegalStateException),但是在产品和合作伙伴表中,所选的合作伙伴和产品将被复制...我不明白这怎么可能?

特殊价格实体:

@Basic(optional = false)
@NotNull
@Column(name = "DISCOUNT_RATE")
private int discountRate;

@JsonBackReference
@JoinColumn(name = "PRODUCT_ID", referencedColumnName = "ID")
@ManyToOne(optional = false)
private Product productId;

@JsonBackReference
@JoinColumn(name = "PARTNER_ID", referencedColumnName = "ID")
@ManyToOne(optional = false)
private Partner partnerId;

合作伙伴实体的参考

@JsonIgnore
@OneToMany(mappedBy = "partnerId")
private Collection<SpecialPrice> specialPriceCollection;

(与产品相同)

使用EclipseLink(JPA 2.1)

有人可以帮助我,我在做什么错?我不想复制所选的合作伙伴和产品...

谢谢!

1 个答案:

答案 0 :(得分:0)

我了解PartnerProduct都是既存的实体吗?

在这种情况下,请在您的服务方法中尝试以下代码:

specialPrice.setPartner(partnerRepository.getOne(specialPrice.getPartnerId().getId());
specialPrice.setProduct(productRepository.getOne(specialPrice.getProductId().getId());
specialPriceRepository.save(specialPrice);

请注意,将CascadeType.ALL@ManyToOne一起使用几乎不是一个好主意。