使用nhibernate hbm映射继承的类

时间:2012-11-28 17:43:30

标签: nhibernate mapping subclass hbm

我有两个同桌的课程。

一个类“Entity”包含表ENTITY中的属性x,y,z 和派生类,“ExtendedEntity”包含更多属性(集合 - 与其他表的关系)。

我想要映射它们但我找不到一种方法来映射子类而不使用鉴别​​器(我不需要一个,有时我想选择Entity对象,有时候选择ExtendedEntity)。 有没有人有任何想法? (我尝试通过复制实体映射并添加新属性来映射ExtendedEntity,但现在当我想获取Entity对象时它会给我带来ExtendedEntity。)

谢谢!

1 个答案:

答案 0 :(得分:0)

考虑到你问题的第一句话:

  

我有两个同桌的课程。

这意味着只有一个表(“ENTITY”)。如果这是真的,那么如果没有鉴别器存在,则不必存在,甚至不应该是任何继承。如果两个实体都与所有行相关,那么(而不是继承)我们需要懒惰。并且只有一个Entity从本机NHibernate行为中获利:具有惰性属性。而且,为了优化某些查询,可以使用 Projections

但是,我的建议只有在我理解你的情况时才能正确:引入这两个实体只是为了减少工作量;但两者都针对一个表中的所有行

唯一类的映射

<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映射进行继承,而是进行预测转换。可以通过这种方式投射多对一属性中的某些属性......