我有两个同桌的课程。
一个类“Entity”包含表ENTITY中的属性x,y,z 和派生类,“ExtendedEntity”包含更多属性(集合 - 与其他表的关系)。
我想要映射它们但我找不到一种方法来映射子类而不使用鉴别器(我不需要一个,有时我想选择Entity对象,有时候选择ExtendedEntity)。 有没有人有任何想法? (我尝试通过复制实体映射并添加新属性来映射ExtendedEntity,但现在当我想获取Entity对象时它会给我带来ExtendedEntity。)
谢谢!
答案 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甚至更小。如果ID
和Code
足够..
SELECT TOP 5 this_.Code as y0_
, this_.EntityId as y1_
FROM ENTITY this_
所以,如果我正确地读了你的问题,在你的场景中,解决方案不会继承,而是NHibernate原生的懒惰
注意:即使在这种情况下,也可能存在从Entity派生的ExtendedEntity。但不是通过NHibernate映射进行继承,而是进行预测转换。可以通过这种方式投射多对一属性中的某些属性......