私はCouponとCouponHistoryの2つのCouponとCouponHistoryを持っています。TransientPropertyValueException:オブジェクトが未保存の一時的なインスタンスを参照しています - 一時的なインスタンスを保存するbeforeQuery flush
@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は私に不平を言っている理由を私は理解していません。
私がCoupon Entityのid generationをAutoに変更すると、すべて正常に動作します。しかし、私は手動でクーポンコードを割り当てて、IDの自動生成が有効範囲にないようにしたい。
助けていただけたら幸いです!
リポジトリのsaveメソッドは新しいインスタンスを返しますか?オブジェクトを保存するとIDが割り当てられるという印象を受けましたか? –
@MunishChandelはいそれは、永続コンテキストにアタッチされた新しいインスタンスを返します –