2011-07-06 99 views
3

我有一個自我加入員工實體類與自我關聯的id,名稱和ref列。我想創建新的實例並將其保存到數據庫。對象引用一個未保存的瞬態實例保存沖洗前的瞬態實例

起初我創建了一個Employee類的實例並命名爲manager。然後我從Employee表中獲取這些值的記錄:Id = 1,Name =「A」,RefId = null 並將這些值設置爲manager對象。之後,我再次創建Employee類的實例
並將其屬性值設置爲: emp.Name =「B」,emp.Ref = manager。 最後我堅持使用base.Add(資源)方法。那時Nhibernate提出了以下錯誤: 「對象引用未保存的瞬態實例在沖洗前保存瞬態實例」。

這是映射文件的內容:

<class name="Employee" table="Employee" schema="dbo" optimistic-lock="none" lazy="true"> 
    <id name="Id" access="property" column="Id"> 
     <generator class="identity" /> 
    </id> 
    <property name="Name" type="String" column="Name" length="50" /> 
    <property name="RefId" type="Int64" column="RefId" insert="false" update="false"/> 
    <many-to-one name="Ref" class="Employee" column="RefId" not-null="false" fetch="select" /> 
class> 

請幫我解決這個錯誤。 THX

+0

只是要說清楚,你的意思是說有一個對象是自引用的,或者你的意思是說有兩個員工對象,它們之間有引用? IE,是否有兩個員工記錄,其間有外鍵,或者一個員工記錄的外鍵指向主鍵。 – bzarah

+0

另外,爲僱員實體提供映射文件或代碼會很有幫助。 – bzarah

+0

感謝您的建議。我會盡量更清楚。我編輯了我的問題。有兩個僱員記錄,他們之間有外鍵。 –

回答

3

比方說,實體1是在數據庫中的現有記錄,和實體2是您要創建具有實體的引用1.

Hibernate是爲了告訴你,新的新記錄要保存的實體(實體2)具有對實體1(來自數據庫的實體)的引用,並且該實體1具有未保存的更改,必須先保存才能保存實體2.最簡單的方法是首先保存實體1 ,然後保存實體2.但是,我認爲真正的問題是如何獲取Entity1的實例。

你說你創建員工的實例,然後命名它的經理,然後從員工表中獲取記錄。如果您試圖從表中更新現有記錄,那麼爲什麼不先取得實體,然後進行編輯?你爲什麼要實例化一個對象?我不確定的另一件事是對象之間的關係是否是雙向的。也就是說,實體1具有實體2的FK,並且實體2具有實體1的FK。如果是這種情況,則需要確保將您的「參考」屬性分配兩次。 Entityy1.Ref = Entity2 AND ALSO Entity2.Ref = Entity1。

+0

我不想edti Entity1,它是Db中的現有記錄。但我必須獲取它,以便將其分配給具有Employee類型的Entity2的RefId屬性。 –

+0

與此同時,只有Entity2具有引用實體1的FK,因爲它是管理者,但實體1在其refId屬性中具有空值。我的目標是讓這些記錄在表中:在refId列中具有空值的經理,以及在refId列中具有managerId值的僱員。 –

+0

更簡單!如果您只需要創建從實體2到實體1的引用,那麼您甚至不需要獲取記錄。如果您知道Entity1的id值,則可以使用Entity2.Ref = Session.Load(idValue)。這將爲您提供參考。我剛剛注意到我早些時候應該抓到的東西。您需要刪除RefId屬性。 就是做參考所需要的。 RefId存在冗餘,可能會給您帶來一些問題。 – bzarah

相關問題