我现在有点困惑。我有三个表:specialPrice,合作伙伴,product。

在specialPrice中,我可以存储可供选定合作伙伴使用的产品的折扣。因此它只有三列。合作伙伴和产品表及其行从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),但是在产品和合作伙伴表中,所选的合作伙伴和产品将被复制...我不明白这怎么可能?

specialPrice实体:

@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)

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

谢谢!

最佳答案

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

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

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


附带说明一下,将CascadeType.ALL@ManyToOne一起使用几乎不是一个好主意。

关于java - 与CascadeType复制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53047862/

10-14 14:57