2012-11-28 163 views
1

我有2個同一個表的類。一個類「實體」包含來自表ENTITY 和派生類的屬性x,y,z,「ExtendedEntity」包含一些更多屬性(集合 - 與其他表的關係)。用nhibernate hbm映射繼承類

我想映射他們兩個,但我找不到一個方式來映射子類而不使用鑑別​​器(我不需要一個,有時我想選擇實體對象,有時候是ExtendedEntity)。 有沒有人有任何想法? (我嘗試通過複製實體映射和添加新的屬性來映射ExtendedEntity,但是現在當我想要獲得實體對象時,它將帶給我ExtendedEntity)。

謝謝!

回答

0

考慮到你的問題的第一句話:

我有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甚至更小。如果IDCode就足夠了..

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

所以,萬一我正確地讀你的問題,在您的方案解決方案將不會在繼承,但在NHibernate的原生懶惰

注:有可能即使在這種情況下也是從實體派生的ExtendedEntity。但不適用於通過NHibernate映射進行繼承,但對於投影轉換。多對一物業的一些物業可以這樣投影...