あなたの質問の最初の文を考慮してください:
私は同じテーブルの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 はさらに小さくなります。ID
とCode
で十分な場合..
SELECT TOP 5 this_.Code as y0_
, this_.EntityId as y1_
FROM ENTITY this_
したがって、私があなたの質問を正しく読んだ場合、あなたのシナリオでは解決策は継承ではなく、NHibernate ネイティブの怠惰になります
注: このシナリオでも、Entity から派生した ExtendedEntity が存在する可能性があります。ただし、NHibernate マッピングによる継承ではなく、射影変換のためです。多対一のプロパティの一部のプロパティは、この方法で射影できます...