1

私は同じテーブルの2つのクラスを持っています。

1 つのクラス「Entity」にはテーブル ENTITY のプロパティ x、y、z が含まれ、派生クラス「ExtendedEntity」にはさらにいくつかのプロパティ (コレクション - 他のテーブルとの関係) が含まれます。

両方をマップしたいのですが、ディスクリミネーターを使用せずにサブクラスをマップする方法が見つかりませんでした (エンティティ オブジェクトと ExtendedEntity を選択したい場合があります)。誰かが何か考えがありますか?(Entity マッピングをコピーして新しいプロパティを追加することで ExtendedEntity をマップしようとしましたが、Entity オブジェクトを取得したいときに ExtendedEntity が表示されます)。

ありがとう!

4

1 に答える 1

0

あなたの質問の最初の文を考慮してください:

私は同じテーブルの2つのクラスを持っています。

これは、テーブル("ENTITY")が 1 つしかないことを意味します。これが真である場合、弁別子が存在しない場合、継承は存在する必要はなく、存在すべきではありません。両方のエンティティがすべての行に関連付けられる場合、(継承の代わりに) 遅延が必要です。そしてEntity、ネイティブの NHibernate の動作から利益を得られるのは、遅延プロパティを持つことだけです。さらに、いくつかのクエリを最適化するには、プロジェクションを使用できます。

ただし、繰り返しますが、私の提案は、シナリオを正しく理解している場合にのみ正しい可能性があります。2 つのエンティティは、作業負荷を軽減するためだけに導入されました。ただし、どちらも 1 つのテーブル内のすべての行を対象としています

唯一のクラスのマッピング

<class name="Entity" table="ENTITY" lazy="true">
<id name="ID" column="Entityd">
  <generator class="native"></generator>
</id>

<!-- standard default always loaded  properties --> 
<property name="Code" />
<property name="Name" />

<!-- only if accessed, lazily loaded properties --> 
<many-to-one  lazy="proxy" name="Currency" column="CurrencyId" cascade="none" />
<property     lazy="true"  name="Image" column="ImageBinary"  />
...

このマッピングにより、最初の 5 つのエンティティを取得できます

var list = session.CreateCriteria<Entity>()
 .SetMaxResults(5)
 .List<Entity>();

生成される SQL ステートメントは次のようになります。

SELECT TOP 5  this_.EntityId as EntityId3_1_
, this_.Code as Code3_1_
, this_.Name as Name3_1_
FROM ENTITY this_ 

また、予測を使用して削減することもできます

var propertyList = NHibernate.Criterion.Projections.ProjectionList();
// projection properties
propertyList.Add(NHibernate.Criterion.Projections.Property("ID"));
propertyList.Add(NHibernate.Criterion.Projections.Property("Code"));

var projected = session.CreateCriteria<Entity>()
.SetMaxResults(5)
.SetProjection(propertyList)
.SetResultTransformer(new NHibernate.Transform
                      .AliasToBeanResultTransformer(typeof(Entity)))
.List<Entity>();

この場合、SQL Select はさらに小さくなります。IDCodeで十分な場合..

SELECT TOP 5 this_.Code as y0_
, this_.EntityId as y1_ 
FROM ENTITY this_

したがって、私があなたの質問を正しく読んだ場合、あなたのシナリオでは解決策は継承ではなく、NHibernate ネイティブの怠惰になります

注: このシナリオでも、Entity から派生した ExtendedEntity が存在する可能性があります。ただし、NHibernate マッピングによる継承ではなく、射影変換のためです。多対一のプロパティの一部のプロパティは、この方法で射影できます...

于 2012-11-29T07:56:05.830 に答える