gpt4 book ai didi

java - 使用 CascadeType 进行复制

转载 作者:行者123 更新时间:2023-11-29 16:46:48 26 4
gpt4 key购买 nike

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

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)

谁能帮帮我,我做错了什么?我不想重复所选的合作伙伴和产品...

谢谢!

最佳答案

我了解合作伙伴产品 都是预先存在的实体?

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com