级联类型的java复制

dwbf0jvd  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(399)

我现在有点困惑。我有三张table:特价、合作伙伴、产品。
在“特殊价格”中,我可以存储为选定合作伙伴提供的产品折扣。所以它只有三列。partner和product表以及它们的行从specialprice表中引用。
这三个表在我的java应用程序中也表示为实体。这里是我的问题:如果我想存储一个特殊的价格,我得到以下例外:

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特殊价格将被创建(因此不再有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)
谁能帮帮我,我做错什么了?我不想复制选定的合作伙伴和产品。。。
谢谢您!

bakd9h0s

bakd9h0s1#

我理解 Partner 以及 Product 两个都是预先存在的实体?
在这种情况下,请在服务方法中尝试以下代码:

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

作为旁注,使用 CascadeType.ALL@ManyToOne 几乎从来都不是个好主意。

相关问题