2011-07-06 53 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

相关问题