java - 使用 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)
有人可以帮助我,我做错了什么?我不想复制选定的合作伙伴和产品...
谢谢!
解决方案
我了解Partner
并且Product
两者都是预先存在的实体?
在这种情况下,请在您的服务方法中尝试以下代码:
specialPrice.setPartner(partnerRepository.getOne(specialPrice.getPartnerId().getId());
specialPrice.setProduct(productRepository.getOne(specialPrice.getProductId().getId());
specialPriceRepository.save(specialPrice);
作为旁注,使用CascadeType.ALL
with@ManyToOne
几乎从来都不是一个好主意。
推荐阅读
- java - 当内存损坏时,Java 中的相同引用/实例变量会发生什么?
- nest-device-access - 新设备访问 API 似乎非常有限
- spring-boot - Spring Data ObjectOptimisticLockingFailureException:批量更新从更新[0]返回了意外的行数;实际行数:0;预期:1
- android - 发布 APK 未按预期工作,它使我的设备颤抖
- python - pd.cut 非均匀 bin 间隔
- graph-theory - 给定边和顶点,如何将它们分成连接的组件?
- typescript - 在类实例上测试私有属性 [TypeScript]
- ajax - 如何检查 shibboleth SSO 会话在 ajax 调用中是否过期?
- reactjs - React-router - 问题通过 url 访问路由
- tabs - 代码块编辑器不显示文件选项卡