2

私のクラス:

    public class Parent
    {
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }
        public virtual IList<Child> Children { get; set; }
        /* other properties */
    }

    public class Child
    {
        public virtual int Id { get; set; }
        public virtual Parent Mother { get; set; }
        public virtual int ItemNumber { get; set; }
        public virtual string Remarks { get; set; }
        /* other properties */
    }

私のデータベース:

PARENTS(ID, NAME, ...) -> PRIMARY KEY = ID
CHILDREN (C_ID, MOTHER_ID, ITEM_NO, REMARKS ....) -> PRIMARY KEY = c_ID

Hibernate マッピング:

  <class name="Parent" table="PARENTS">
        <id name="Id"  column="ID">
          <generator class="increment" />
        </id>
        <property name="Name" column="NAME"/>
        <list name="Children" cascade="all" inverse="true">
        <key column="MOTHER_ID" not-null="true" />
           <list-index base="1" column="ITEM_NO"/>
          <one-to-many class="Child" />
        </list>
 </class>

  <class name="Child" table="CHILDREN">
        <id name="Id"  column="C_ID">
          <generator class="increment" />
        </id>
        <many-to-one name="Mother" class="Parent" column="MOTHER_ID" />
        <property name="ItemNumber" column="ITEM_NO"/> 
        <property name="Remarks" column="REMARKS"/>
 </class>

私のコード:

Parent p = new Parent();
//set parent properties here
Child c = new Child();
//set child properties here

p.Children.add(c);
c.Mother = p;

//Save parent

質問:

上記のコードは、親とすべての子をそれぞれのテーブルに保存します。ただし、すべての子の項目 ITEM_NO のデフォルト値はゼロです。特定の親の子ごとに 1 から始まる徐々に増加する値を ITEM_NO に自動的に割り当てるのに役立つマッピングはありますか? つまり、ITEM_NO のシーケンスは、1 から各親の子の数まで繰り返す必要があります。

NB: Child は独立したエンティティである必要があるため、親を介する必要がなくてもクエリを実行できるはずです。

4

2 に答える 2

0

問題は list-element の insert="true" だと思います。これは、外部キーを設定するのは子供の責任であることを NHibernate に伝えるためです。そして、子供はリストのマッピングについて知りません。

于 2013-02-07T12:57:21.790 に答える
0

データベースにシーケンスを作成する必要がある質問を正しく理解している場合(説明を参照)、簡単な例は次のようになります(データベースごとに異なる場合があります):

CREATE SEQUENCE item_no_seq START WITH 1 INCREMENT BY 1

次に、マッピングを少し変更します。

<id name="ItemNumber" type="integer" column="ITEM_NO">
  <generator class="sequence">
    <param name="sequence">item_no_seq</param>
  </generator>
</id>
于 2013-02-07T13:04:44.567 に答える