2017-08-20 12 views
2

私は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の自動生成が有効範囲にないようにしたい。

助けていただけたら幸いです!

答えて

1

あなたは)(保存エンティティを保存lucklyたときに、それがCouponHistoryを保存する前に管理する必要があり、その後クーポンをカスケード接続されていないので、管理を返します。あなたが必要とするすべてのクーポン

@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); 
} 
にそれを割り当てることがあるので、エンティティを永続化
+0

リポジトリのsaveメソッドは新しいインスタンスを返しますか?オブジェクトを保存するとIDが割り当てられるという印象を受けましたか? –

+0

@MunishChandelはいそれは、永続コンテキストにアタッチされた新しいインスタンスを返します –

0

Couponを保存した後に、エンティティマネージャーを@PersistenceContextに接続し、this.entityManager.flush()に接続してみます。

Hibernateは、永続化しているエンティティを可能な限り多く(通常はトランザクションが閉じられるまで)待つことを試みています。明示的にフラッシュすることで強制的に強制することができます。

関連する問題

 関連する問題