2012-01-22 4 views
0
class A {..} 
class ContainedA { property of type A and some extra information } 
class B : A { collection of type ContainedA } 

を保存していないが、いくつかのB年代にAの単一のインスタンスが含まれていることができるようにすることです、B自体は、それが他のAのあなたのアイデアを伝えることができたようNHibernateの1対多の子供

を保持できるタイプAのもあります

AとBのマッピング

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
    namespace="REDACTED" 
    assembly= "REDACTED"> 

    <class name="A" table="A" discriminator-value="1"> 
     <id name="Id" column="Id" type="int" access="field.camelcase-underscore"> 
      <generator class="identity" /> 
     </id> 

     <discriminator column="Type" type="int"/> 

     <subclass name="B" extends="A" discriminator-value="2"> 
      <bag name="ContainedAs" cascade="all"> 
       <key column="AInternalId"/> 
       <one-to-many class="ContainedA"/> 
      </bag> 
     </subclass> 

    </class> 
</hibernate-mapping> 

ContainedA

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
    namespace="REDACTED" 
    assembly= "REDACTED"> 

    <class name="ContainedA" table="ContainedA"> 
     <id name="Id" type="int" access="field.camelcase-underscore" column="Id"> 
      <generator class="identity" /> 
     </id> 
     <many-to-one name="A" class="A" column="ContainedAInternalId" cascade="save-update"/> 
     <property name="SomeOtherInfoString" column="SomeOtherInfoString" not-null="true"/> 
    </class> 
</hibernate-mapping> 

のマッピング私の問題は、私はcontaineを保存するときにということですそれはContainedAsのコレクションではなく、実際のAのものではありません。 これは堅牢で、Bは既存のものと存在しないものの両方に割り当てられ、私は単一のセッションを実行したいと考えています.Save(B)とすべてのものを保存しました。

ご迷惑をおかけして申し訳ございません。

EDIT:まだあなたがマッピングに加えて、コードを表示する必要が

+1

'session.SFlush()'の後に助けてもらえます – Firo

+0

@Firo私は試しましたが、役に立たなくなってしまいました。 私はBをBから具体的なサブクラスマッピングに移すことで問題を幾分解決しました。コードBは2つの異なる実装を持つベースサブクラス自体です。明らかにNhibernateはサブクラスのベースマッピング上にあったためバッグを無視しました。 – DorD

答えて

0

これは完全な答えではなく、問題を解決した回避策です。 (私のコメントからコピー)

は「私は多少私のコードBに、 具象サブクラスマッピングにBから袋を移動することで、問題を解決してきたが は2を持っていることをベースサブクラスそのものであります異なる実装、明らかにNhibernateはサブクラスのベースマッピング上にあったので、ちょうど を無視しました。

1

を働いていない、オリジナルのHBMのそれを固定のいずれかでエラーを検出しました。しかし、逆属性が設定されていないことがわかります。 inverse属性は、どちらの側が関係を所有しているかを定義します。これは少し直感的ですが、反対側が関係を所有していることを宣言するためにinverse = "true"を設定します。

典型的な1対多の関係は、多くの側が逆側になるようにマップされます。このマッピングでは、コレクションに含まれるオブジェクト(片面)を追加し、オブジェクトのオブジェクトを含むオブジェクトへの参照を多くの側に設定する必要があります。

+0

私は元の質問へのコメントに記述したように問題を解決しました。問題は、抽象サブクラスに2つのサブクラスが定義されていて、nhibernateがマッピングを埋め込んだときにバッグをマッピングした2つのサブクラスが機能しました。 – DorD

関連する問題