2014-09-26 26 views
0

我得到一個奇怪的異常而持續的訂單對象 有多對一的關係與deliveryMode休眠TransientPropertyValueException同時堅持多到一的關係已經ENTITYID爲0

以下是在訂單對象中定義的映射。

@ManyToOne 
@JoinColumn(name = "DELIVERY_MODE_ID") 
private DeliveryMode deliveryMode; 

遞送模式已經存在於數據庫, 因此沒有必要指定級聯的。

以下是在DeliveryMode類的雙向映射:

@OneToMany(mappedBy = "deliveryMode") 
private List<Order> orders; 

我設置的訂單對象的DeliveryMode和保存訂單使用JPA實體管理器爲:

Order order = new Order(); 
DeliveryMode deliveryMode = new DeliveryMode(); 
deliveryMode.setDeliveryModeId(0); 
order.setDeliveryMode(deliveryMode); 
entityManager.persist(order); 

上面的代碼給出以下例外:

org.hibernate.TransientPropertyValueException: 
object references an unsaved transient instance for given deliveryMode. 

del數據庫中已存在iveryModeId = 0。 當我試圖保存除0之外的deliveryModeId的條目上面的代碼片段可以正常工作。

謝謝:)

+0

可能主鍵爲0可能會導致休眠。 – Zeus 2014-09-26 12:54:52

+0

你可以顯示交付模式的Java類嗎? – Chaitanya 2014-09-26 12:59:10

+0

我已更新傳遞模式映射。 – Rishi 2014-09-26 13:21:02

回答

0

終於得到了解決。我使用原始簡稱爲Id。 轉換爲包裝解決了這個問題。 在使用基本數據類型的情況下,似乎hibernate不接受0作爲ID。 謝謝大家:)

當使用基本類型時,默認情況下,主鍵id將被設置爲0,如果0是實體對應表中實際id列的值,hibernate會感到困惑。

0

在您的代碼:

Order order = new Order(); 
DeliveryMode deliveryMode = new DeliveryMode(); 
deliveryMode.setDeliveryModeId(0); 
order.setDeliveryMode(deliveryMode); 
entityManager.persist(order); 

您已經創建了一個新的Order對象和新DeliveryMode對象,然後分配DeliveryModeOrder對象。然後你傳遞Order對象到hibernate並要求它保存它(或者堅持它)。

現在hibernate把它從持久方法獲得的對象,它是Order對象,並將其放置在它的會話緩存(第一級緩存)中。現在在保存這個Order時,它觀察到父對象Order有一個子對象DeliveryMode。因此它會檢查它的會話(第一級緩存),看看它是否有的DeliveryMode對象爲0,這是您在代碼中設置的對象。然後發現DeliveryMode沒有這樣的對象,id0,所以它會拋出一個異常,說你必須在保存Order對象之前保存DeliveryMode對象。這就是例外說:

org.hibernate.TransientPropertyValueException: 
object references an unsaved transient instance for given deliveryMode. 

因此,要解決這個問題,你需要從數據庫中獲取的DeliveryMode對象所需id這是0。一旦你得到對象,對象將會進入休眠的會話緩存。現在將這個DeliveryMode對象分配給您的Order對象,然後保存您的Order對象。

正如他的意見建議由Ahishs,檢查你如何能做到這此鏈接:java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException

+0

嗨Chaitanya我從休眠獲得DeliveryMode對象,並嘗試保存訂單。但仍然問題仍然存在,並且只有當deliveryModeId爲0時纔會發生。 – Rishi 2014-09-29 09:04:29

+0

@RishabhRawal,您可以發佈您嘗試過的確切代碼,並且還可以將完整的異常堆棧跟蹤添加到您的問題中,而不是一個班輪錯誤消息。 – Chaitanya 2014-09-30 03:05:28