【问题标题】:Mapping inherited class with nhibernate hbm使用 nhibernate hbm 映射继承的类
【发布时间】:2012-11-16 16:00:09
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

    标签: nhibernate mapping subclass hbm


    【解决方案1】:

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

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

    表示只有一张表("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 映射继承,而是用于 Projections Transformation。多对一属性中的一些属性可以通过这种方式投影...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      相关资源
      最近更新 更多