2011-07-06 9 views
3

自分自身と関係のあるid、name、およびrefカラムを持つemployees joinエンティティクラスを持っています。私はそれの新しいインスタンスを作成し、それをdbに保持したい。オブジェクトは未保存の一時インスタンスを参照します。フラッシングする前に一時インスタンスを保存します

私はEmployeeクラスのインスタンスを作成し、それをmanagerという名前で作成しました。 Id = 1、Name = "A"、RefId = null の値を持つEmployeeテーブルからレコードを取得し、それらの値をマネージャオブジェクトに設定しました。その後私は再びEmployeeクラスのインスタンスを作成しました
このプロパティの値は emp.Name = "B"、emp.Ref = managerのように設定します。 最後に、base.Add(resource)メソッドを使用して永続化しました。 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

自己参照するオブジェクトが1つ存在することを意味しますか、または2つの従業員オブジェクトが存在し、それらの間に参照があることを意味しますか? IEの場合、2つの従業員レコードがあり、それらの間に外部キーがあるか、またはプライマリキーを指す外部キーを持つ従業員レコードが1つあります。 – bzarah

+0

また、従業員エンティティのマッピングファイルまたはコードを持つと便利です。 – bzarah

+0

おかげさまで、ありがとうございました。私はもっ​​と明確にしようとします。私は私の質問を編集しました。それらの間に外部キーを持つ従業員レコードが2つあります。 –

答えて

3

のは2あなたはそれが1

Hibernateは新しいことを語っているエンティティへの参照を持って作成しようとしている新しいレコードであるエンティティ1は、データベース内の既存のレコードである、とエンティティとしましょうエンティティ1(データベースからのもの)への参照が保存されているエンティティ1(エンティティ2)は保存されていない変更が保存されているため、エンティティ2を保存することができます。エンティティ2を保存します。しかし、実際の問題は、Entity1のインスタンスを取得する方法です。

employeeのインスタンスとインスタンスを作成し、managerという名前を付けてからemployeeテーブルからレコードを取得するとします。既存のレコードをテーブルから更新しようとしている場合は、まずエンティティをフェッチしてから編集してください。なぜオブジェクトをインスタンス化するのですか?私が確信していなかったもう一つのことは、オブジェクト間の関係が双方向かどうかということでした。つまり、エンティティ1にはFK to Entity 2がありますが、またエンティティ2にはFK to Entity 1があります。この場合、「Ref」プロパティを2回割り当ててください。 Entityy1.Ref = Entity2 AND ALSO Entity2.Ref = Entity1。

+0

Dbの既存のレコードであるedty Entity1にしたくありません。私は従業員の種類を持つEntity2のRefIdプロパティに割り当てることができるように私はそれをフェッチする必要があります。 –

+0

一方、Entity2には、マネージャとしてEntity1を参照するFKがありますが、Entity1にはrefIdプロパティにnull値があります。私の目標は、テーブルにレコードにこれらを持っていることです:refIdの列にnull値を持つマネージャーとそれにrefId列にmanagerId値を持つ従業員。 –

+0

さらに簡単に! Entity2からEntity1への参照を作成するだけであれば、実際にレコードを取得する必要はありません。 Entity1のid値がわかっている場合は、Entity2.Ref = Session.Load(idValue)を使用できます。これはあなたのための参照を接続します。私はちょうど私が以前に捕らえたはずのものに気づいた。 RefIdプロパティを削除する必要があります。 は参照をするために必要なすべてです。 RefIdを持っていると冗長性があり、おそらくあなたのためにいくつかの問題を引き起こしています。 – bzarah

関連する問題