代码之家  ›  专栏  ›  技术社区  ›  Matthias Schippling

通过复合id的密钥进行多对一导航是可能的吗?

  •  2
  • Matthias Schippling  · 技术社区  · 15 年前

    我使用以下设置映射了一些(遗留)表:

    <class name="StructureUser">
        <composite-id>
            <key-many-to-one name="Structure" class="Structure" column="STRUKTUR_ID" />
            <key-many-to-one name="User" class="User" column="USERID" />
        </composite-id>
        ...
    </class>
    
    <class name="Structure">
        <id name="Id" column="id" type="Int32" >
            <generator class="native"/>
        </id>
        <property name="Low" column="low" type="Int32" />
        ...
    </class>
    

    ICriteria crit1 = Session.CreateCriteria(typeof(StructureUser))
        .CreateAlias("Structure", "struc")
        .Add(Restrictions.Le("struc.Low", 123));
    
    ICriteria crit2 = Session.CreateCriteria(typeof(StructureUser))
        .Add(Restrictions.Le("Structure.Low", 123));
    

    crit1中的错误来自于数据库,它说“struc\u 1.Low在此上下文中无效”,因为NHibernate没有生成sql命令中限制所需的连接。 crit2中的错误来自NHibernate,它告诉我它不能访问结构。低“StructureUser上的属性。

    我通过用关键属性元素声明复合id并声明与普通多对一元素的关系来解决这个问题。

    这个问题还有别的解决办法吗?

    2 回复  |  直到 15 年前
        1
  •  0
  •   Jaguar    15 年前

    你试过了吗

    ICriteria crit1 = Session.CreateCriteria(typeof(StructureUser))
        .CreateCriteria("Structure", "struc")
        .Add(Restrictions.Le("struc.Low", 123));
    
        2
  •  0
  •   Ludovic Perseghini    10 年前

    正如最初的海报所说,您需要从要别名的复合键在元素上添加多对一关系 您需要将属性“insert”和“update”设置为“false”

    然后可以将它保存在复合id中,不需要将其更改为键属性元素。

    <class name="StructureUser">
    <composite-id>
        <key-many-to-one name="Structure" class="Structure" column="STRUKTUR_ID" />
        <key-many-to-one name="User" class="User" column="USERID" />
    </composite-id>
    
    <many-to-one name="Structure" class="Structure" column="STRUKTUR_ID" insert="false" update="false" />
    
    ...
    

    推荐文章