Java TransientPropertyValueException:对象引用未保存的临时实例-在刷新查询之前保存临时实例

Java TransientPropertyValueException:对象引用未保存的临时实例-在刷新查询之前保存临时实例,java,spring,hibernate,Java,Spring,Hibernate,我有两个hibernate实体优惠券和CouponHistory,CouponHistory和优惠券之间有单向关系 @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; ...

我有两个hibernate实体优惠券和CouponHistory,CouponHistory和优惠券之间有单向关系

@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不在范围内


任何帮助都将不胜感激

尝试使用
@PersistenceContext
连接实体管理器,并在保存
优惠券后执行
此.entityManager.flush()


Hibernate试图尽可能多地等待持久化实体(通常直到事务关闭),您可以通过显式刷新来“强制”持久化实体

由于您不是层叠优惠券,因此需要在保存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);
}

存储库的save方法是否返回一个新实例。我觉得save对象被分配了一个Id?@MunishChandel是的,它返回附加到持久性上下文的新实例