2013-08-30 46 views
0

在NH中是一個配置設置'use_identifier_rollback',它將實體的id設置恢復爲默認值。nhibernate use_identifier_rollback all-delete-orphan

此設置適用於除'delete-orphan'以外的每個級聯選項。 (我知道爲什麼!)

看看C# Identifier Rollback

看看Java Identifier Rollback

// Works with 'use_identifier_rollback' and 'cascade-option=all' 
// but not with 'cascade-option=all-delete-orphan' 
Sample sample = new Sample("sample"); 
sample.Add(new Subsample("subsample"); 
int sampleId; 
using(var session = sessionFactoy.OpenSession()) 
{ 
    using(var tx = session.BeginTransaction()) 
    { 
     session.Save(sample); 
     sampleId = sample.Id; 
     Assert.That(sampleId, Is.GreaterThan(0)); 
     Assert.False(sample.IsTransient) 
    } // Rollback 
} 
Assert.That(sample.Id, Is.EqualTo(0)); 
Assert.True(sample.IsTransient) 

它是不好的做法,恢復的ID rollbacking保存時? 在java代碼中沒有註釋掉並且工作。

更新: 當您刪除實體時,您通常會期望什麼行爲?

// Works with 'use_identifier_rollback' and 'cascade-option=all' 
// but not with 'cascade-option=all-delete-orphan' 
int sampleId; // sampleId from above 
using(var session = sessionFactoy.OpenSession()) 
{ 
    using(var tx = session.BeginTransaction()) 
    { 
     Sample sample = session.Get<Sample>(sampleId); 
     Assert.That(sampleId, Is.GreaterThan(0)); 
     Assert.False(sample.IsTransient) 
     session.Delete(sample); 
     tx.Commit(); 
    } 
} 
Assert.That(sample.Id, Is.EqualTo(0)); 
Assert.True(sample.IsTransient) 

隨着「use_identifier_rollback」 NHibernate的設置ID爲「0」或更準確的身份的默認。我IsTransient屬性取決於Id == 0

  • 你是如何處理的實體,當他們變得刪除,是實體短暫的情況下或者什麼是刪除實體的ID,...?
+0

我知道我從來沒有使用它。回滾通常意味着整個工作單元失敗,並且這包括實例化對象的代碼。 –

+0

@oskar是的,對於一個新的實體來說,這聽起來很合理。但是,當你刪除一個實體時你期望什麼行爲?現在是暫時的,ID是'0'嗎? – crip

+0

到目前爲止,除了在被刪除之後全部使用該實體,因此它的id並不重要。這是爲了某種死後採伐目的嗎? –

回答

0

看起來它只是尚未在NHibernate中實現。查看NHibernate的問題跟蹤器:NH-387。如果這對您很重要,請登錄並投票選出問題。你甚至可以通過GitHub貢獻單元測試和修復。看起來有人已經在這個問題上做了一些工作 - 有幾個補丁文件附加到這個問題上,但我不知道他們在什麼狀態。