2017-08-20 63 views
2

我有兩個休眠實體Coupon和CouponHistory,CouponHistory和Coupon之間有Uni Directional Relationship。TransientPropertyValueException:對象引用未保存的瞬態實例 - 在查詢沖水前保存瞬態實例

@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自動生成不在範圍內。

任何幫助,將不勝感激!

回答

1

既然你不級聯優惠券,那麼你需要它來節省CouponHistory,luckly節省保存(實體時)將返回管理之前管理堅持實體因此,所有你需要的是將其分配到的優惠券

@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

存儲庫的保存方法是否返回新實例。我在印象中保存對象被分配了一個Id? –

+0

@MunishChandel是它返回連接到持久化上下文的新實例 –

0

嘗試通過@PersistenceContext連線實體管理器,並在保存Coupon後執行this.entityManager.flush()。 Hibernate正試圖儘可能地等待持久實體(通常直到事務被關閉),並且你可以通過明確的沖洗來「強制」這個事實。

相關問題