gpt4 book ai didi

java - transient 属性值异常 : object references an unsaved transient instance - save the transient instance beforeQuery flushing

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:10:40 36 4
gpt4 key购买 nike

我有两个 hibernate 实体 Coupon 和 CouponHistory,在 CouponHistory 和 Coupon 之间具有单向关系。

@Entity
@Table(name = "validity_coupon")
public class Coupon {

@Id
@Column(length = 50, unique = true, nullable = false)
private String code;

private int validity;
private boolean used;

...}


@Entity
@Table(name = "coupon_history")
@TableGenerator(name = "seqGen", table = "shunya_id_gen", pkColumnName = "GEN_KEY", valueColumnName = "GEN_VALUE",
pkColumnValue = "coupon_history_seq", allocationSize = 1)
public class CouponHistory {

@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "seqGen")
private long id;

@Temporal(TemporalType.TIMESTAMP)
private Date createdOn;

@ManyToOne(fetch = FetchType.LAZY)
private Coupon coupon;

...}

有一个事务服务方法试图将两个实体保存在一个事务中。这里使用 Spring 来处理事务。

@Transactional
public void createCoupon() {
Coupon coupon = new Coupon();
coupon.setCode(RandomStringUtils.randomAlphanumeric(5));
coupon.setValidity(1);
couponRepository.save(coupon);

CouponHistory couponHistory = new CouponHistory();
couponHistory.setCreatedOn(new Date());
couponHistory.setCoupon(coupon);
couponHistoryRepository.save(couponHistory);
}

当我调用此方法时出现以下异常 -

org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance beforeQuery flushing : com.poc.CouponHistory.validityCoupon -> com.poc.Coupon; nested exception is java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance beforeQuery flushing : com.poc.CouponHistory.validityCoupon -> com.poc.Coupon

我不明白为什么当我在单个事务中先保存子实体再保存父实体时,hibernate 会提示我。

如果我将优惠券实体的 ID 生成更改为自动,那么一切都会开始正常工作。但我想手动分配优惠券代码,因此 Id 自动生成不在范围内。

如有任何帮助,我们将不胜感激!

最佳答案

由于您不是级联优惠券,因此您需要在保存 CouponHistory 之前对其进行管理,幸运的是,在保存实体时 save() 将返回托管的持久化实体,因此您只需将其分配给优惠券

 @Transactional
public void createCoupon() {
Coupon coupon = new Coupon();
coupon.setCode(RandomStringUtils.randomAlphanumeric(5));
coupon.setValidity(1);
coupon = couponRepository.save(coupon);//save will return the managed entity

CouponHistory couponHistory = new CouponHistory();
couponHistory.setCreatedOn(new Date());
couponHistory.setCoupon(coupon);
couponHistoryRepository.save(couponHistory);
}

关于java - transient 属性值异常 : object references an unsaved transient instance - save the transient instance beforeQuery flushing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45778937/

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