考慮到你的問題的第一句話:
我有2個班的同桌。
這意味着只有一個表(「ENTITY」)。如果這是真的,那麼不需要,甚至不應該有任何繼承,如果沒有鑑別器存在。如果兩個實體都與所有行相關,那麼(而不是繼承)我們需要懶惰。並且只有一個Entity
從本機NHibernate行爲中獲利:具有懶惰屬性。甚至更多,優化一些查詢 - 可以使用預測。
但是,我的建議可能是正確的,只有當我確實瞭解您的方案時:這兩個實體的引入只是爲了減少工作量;但是都針對一個表中的所有行。
的唯一一類
<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的原生懶惰
注:有可能即使在這種情況下也是從實體派生的ExtendedEntity。但不適用於通過NHibernate映射進行繼承,但對於投影轉換。多對一物業的一些物業可以這樣投影...