1

我有同一张桌子的两个班级。

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

我想映射它们,但我找不到不使用鉴别​​器来映射子类的方法(我不需要鉴别器,有时我想选择实体对象,有时是扩展实体)。有人知道吗?(我试图通过复制实体映射并添加新属性来映射扩展实体,但现在当我想要获取实体对象时,它给我带来了扩展实体)。

谢谢!

4

1 回答 1

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 就更小了。如果IDandCode就足够了..

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

因此,如果我正确阅读了您的问题,在您的方案中,解决方案将不是继承,而是 NHibernate 本机懒惰

注意:即使在这种情况下,也可能有从 Entity 派生的 ExtendedEntity。但不是用于通过 NHibernate 映射继承,而是用于 Projections Transformation。可以通过这种方式投影来自多对一属性的某些属性...

于 2012-11-29T07:56:05.830 回答