首页 > 解决方案 > 使用 CascadeType 进行复制

问题描述

我现在有点困惑。我有三个表:specialPrice、partner、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),但在产品和合作伙伴表中,所选合作伙伴和产品将被复制......我不明白这怎么可能?

特价实体:

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

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

谢谢!

标签: javamysqljpa

解决方案


我了解Partner并且Product两者都是预先存在的实体?

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

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

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


推荐阅读