2016-06-08 85 views
0

我有以下實體:NHibernate的通過碼 - 保存未保存(瞬態)的子實體實體

public class Item 
{ 
public virtual long ID { get; set; } 
public virtual Version Version { get; set;} 
More properties... 
} 

在實體映射我有:

ManyToOne(p => p.Version, m => 
{ 
m.Column("VERSION_ID"); 
} 

實體Version也被映射代碼,它的ID是一個自動生成的序列。 當我保存Item時,我創建了一個新的Version,將其分配給Version屬性並保存。我只想在Item成功保存後才保存Version實體。現在,當我這樣做時,它會拋出一個TransientObjectException。有沒有可能解決這個問題?

回答

1

除非映射指定Cascade.Persist或Cascade.All的屬性,否則不能通過映射屬性(Item-> Version)保存引用瞬態對象的實體。

另一件事是,因爲你應該在一個事務中運行該代碼,插入順序應該沒有關係。如果在保存版本後但在保存項目之前引發異常(或發生其他情況),則應回退事務,並且沒有人會看到新版本。

下面的代碼片段展示瞭如何使用nHibernate開始/提交事務。注意,如果事務在處理之前沒有被提交,事務將被回滾。

using(var session = sessionFactory.OpenSession()) 
using(var transaction = session.BeginTransaction()) 
{ 
    // Do your thing here... 

    transaction.Commit(); 
} 
+0

所以級聯意味着子實體會與父級一起保存,並且會在出現錯誤時回滾? – user6251216

+1

Cascade.Persit將在保存父項時(明確地或當會話刷新時)保存所引用的實體。您有責任在交易中執行此操作,以便在發生問題時可以回滾。我已經用一個片段更新了答案,顯示瞭如何完成。 –

+0

該實體與運行代碼分開保存,因此難以訪問該事務。我想我必須處理Cascade.All這個工作。 – user6251216

相關問題