0

以下の表があります。

Bucket(
 bucketId smallint (PK)
 name varchar(50)
)

BucketUser(
 UserId varchar(10) (PK) 
 bucketId smallint (PK)
)

複合キーは問題ではありません。これを回避する方法はわかっていますが、バケット クラスに BucketUser の IList を含める必要があります。私はオンラインリファレンスを読んで、クラックしたと思っていましたが、まだクラックしていません。2 つのマッピングを以下に示します。

- バケツ -

<class name="Bucket,Impact.Dice.Core" table="Bucket">
  <id name="BucketId" column="BucketId" type="Int16" unsaved-value="0">
    <generator class="native"/>
  </id>

  <property column="BucketName" type="String" name="BucketName"/>

  <bag name="Users" table="BucketUser" inverse="true" generic="true" lazy="true">
    <key>
      <column name="BucketId" sql-type="smallint"/>
      <column name="UserId" sql-type="varchar"/>
    </key>
    <one-to-many class="Bucket,Impact.Dice.Core" not-found="ignore"/>
  </bag>
</class>

-- バケットユーザー --

<class name="BucketUser,Impact.Dice.Core" table="BucketUser">
  <composite-id>
    <key-many-to-one name="BucketUser" class="Bucket,Impact.Dice.Core" column="BucketId"/>
    <key-property name="UserId" column="UserId" type="string"></key-property>
  </composite-id>
</class>
4

2 に答える 2

7

キーは、主キーではなく、包含エンティティへの外部キーです。

次の 2 つのオプションがあります。

  • クラスは、独自の ID を持つ独立したエンティティを表します。他のクラスから参照でき、常に同じテーブルにあり、個別にロードできます。
  • または、独立したアイデンティティを持たない別のエンティティの一部です。他のクラスによって参照される場合、それは常に別のテーブルにあります。親エンティティから独立して(簡単に)ロードできませんでした。

Bucketuser は独立したエンティティです。独自のマッピング定義があり、1 対多を使用して参照します。あなたのケースでは複合キーを取得しますが、私はこれを避けます。

<!-- reference to BucketUser. There is not table attribute needed. -->
<bag name="Users" inverse="true" generic="true" lazy="true">
  <key>
    <!-- foreign key -->
    <column name="BucketId" sql-type="smallint" />
  </key>
  <one-to-many class="Bucket,Impact.Dice.Core" not-found="ignore"/>
</bag>

<!-- BucketUser mapped as an independent entity -->
<class name="BucketUser" ... >
  <!-- here is the composite id, try to avoid this -->
  <composite-id>
    <key-property name="BucketId">
    <key-property name="UserId">
  </composite-id>
</bag>

Bucketuser は Bucket の依存部分です。バケットへの外部キーは、同時に主キーです。

<!-- The table is defined on the fly by the table attribute -->
<bag name="Users" table="BucketUser" inverse="true" generic="true" lazy="true">
  <key>
    <column name="BucketId" sql-type="smallint" />
  </key>
  <!-- use composite-element to define the contents of the table -->
  <composite-element>
    <!-- define the contents of the BucketUser here -->
    <property name="UserId" sql-type="varchar"/>
  </composite-element>
</bag>

どの戦略が適切かは、ケースによって異なります。

于 2009-04-20T08:47:21.650 に答える
0

どのようなエラーが発生していますか? そのマッピングを実際にカットアンドペーストした場合、解決策はコンマを置き換えるのと同じくらい簡単かもしれません

<one-to-many class="Bucket,Impact.Dice.Core" not-found="ignore"/>

ピリオド付き。

于 2009-04-19T23:09:26.110 に答える