2013-06-30 22 views
0

我有一個視頻類型的對象。我將視頻存儲在我的數據庫中,但我希望每個視頻條目都是唯一的。唯一性由客戶端提供的11位字符串決定。具有客戶端生成的ID的實體。我應該爲NHibernate的ID有一個單獨的屬性?

因此,我已經生成此文件Video.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Streamus" namespace="Streamus.Domain"> 

    <class name="Video" table="[Videos]" lazy="false" mutable="false"> 
    <id name="Id" length="11" type="String" /> 

    <property name="Title" not-null="true" /> 
    <property name="Duration" not-null="true" /> 
    <property name="Author" not-null="true" /> 
    </class> 

</hibernate-mapping> 

我沒有刪除或更新任何條目,以該表的意圖。所以,我把我的課程標記爲不可變的。

現在,我認爲這是解決問題的一個很好的方法,但是我遇到了父級對象級聯更新的問題。因爲我的ID是在客戶端生成的,並且我沒有使用第二個標識符,所以NHibernate無法可靠地確定視頻是否需要插入或更新(請注意,它永遠不會因更新不可變而更新)。

喜歡的東西:

Video video = new Video("s91jgcmQoB0", "Tristam - Chairs", 219, "MeoMix"); 
new VideoManager().Save(video); 

// Create a new PlaylistItem and write it to the database. 
string title = video.Title; 
PlaylistItem playlistItem = new PlaylistItem(title, video); 

Playlist.AddItem(playlistItem); 
PlaylistManager.SavePlaylistItem(playlistItem); 

其中PlaylistItem的引用的hbm.xml視頻作爲:

<many-to-one name="Video" column="VideoId" not-null="true" cascade="save-update" /> 

上面的代碼生成一個NonUniqueObjectException。這是因爲VideoManager在一個會話中與視頻協同工作,關閉它,然後PlaylistManager在新會話中重新引用相同的視頻,但NHibernate無法容納,因爲它沒有良好的ID。

刪除cascade =「save-update」的選項可以解決這個問題,但是我沒有得到讓NHibernate隱式創建數據庫中的Video對象的好處。相反,我必須手動保存Video對象,然後保存PlaylistItem對象。這顯然不理想。

所以,我想知道 - 我應該分配一個GUID到我的視頻對象?如果是這樣,我怎麼能強制這樣的事實,我只希望在我的表中唯一的視頻條目,其中由11位數字字符串ID定義的唯一性?

讓我知道,如果我可以提供更多的信息,使之更清晰。

回答

2

首先修改ID一節中,你video.hbm.xml有一個「分配的」發生器

<id name="id" ....> 
    <generator class="assigned" /> 
</id> 

這告訴UR標識手動從客戶端生成NHibernate的。

還有你的同一個對象被多個會話操縱會導致一致性錯誤。因此,要麼爲您的一批操作使用唯一的會話,要麼通過使用session確保您的對象在所有會話中得到正確的跟蹤。

+0

哦,我不知道分配的標籤。哎呀,不知道那個人怎麼溜我。好的,謝謝你,我認爲這將解決問題! –

相關問題