如何用NHibernate映射带有复合键的包

时间:2011-10-14 16:25:48

标签: nhibernate composite-key

我试图用NHibernate映射两个对象

这是我的第一个对象“Asociado”由“Justificaciones”组成,旁边是“Justificacion”,它有一个组合键

public class Justificacion
{
    private int _id; //(PK) 
    private Asociado _asociado;(FK)

    public override bool Equals(object obj)
    {

        return base.Equals(obj);

    }

    public override int GetHashCode()
    {
        return base.GetHashCode();
    }

    public override string ToString()
    {
        return base.ToString();
    }

    public virtual int Id
    {
        get { return _id; }
        set { _id = value; }
    }

    public virtual Asociado Asociado
    {
        get { return _asociado; }
        set { _asociado = value; }
    }
}

public class Asociado
{
    private int _id;
    private IList<Justificacion> _justificaciones;

    public virtual int Id
    {
        get { return this._id; }
        set { this._id = value; }
    }

    public virtual IList<Justificacion> Justificaciones
    {
        get { return _justificaciones; }
        set { _justificaciones = value; }
    }
}

这是我所做的映射,但是无法正常工作

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="Trascend.Bolet.ObjetosComunes"
                   namespace="Trascend.Bolet.ObjetosComunes.Entidades">

  <class name="Justificacion" table="FAC_ASO_JUST">
    <composite-id>
      <key-property name="Id" column="CCARTA" type="int"></key-property>
      <key-property name="Asociado" column="CASOCIADO" type="int"></key-property>
    </composite-id>

    <many-to-one name="Asociado" class="Asociado">
      <column name="CASOCIADO"/>
    </many-to-one>


  </class>

</hibernate-mapping>


<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="Trascend.Bolet.ObjetosComunes"
                   namespace="Trascend.Bolet.ObjetosComunes.Entidades">

  <class name="Asociado" table="FAC_ASOCIADOS">
    <id name="Id" column="CASOCIADO" />

  <bag name="Justificaciones"
          fetch="join"
          inverse="true"
          cascade="save-update">
    <key>
      <column name="CCARTA"/>
      <column name="CASOCIADO"/>
    </key>
    <one-to-many class="Justificacion"/>
  </bag>

</hibernate-mapping>

1 个答案:

答案 0 :(得分:1)

我认为问题是列映射两次<id name="Id" column="CASOCIADO" /><column name="CASOCIADO"/>

将Justificacion映射为组件

<bag name="Justificaciones"
     fetch="join"
     inverse="true"
     cascade="save-update">
  <key column ="CASOCIADO"/>
  <composite-element class="Justificacion">
    <parent name="Asociado"/>
  </composite-element>
</bag>

亲: - 您不再需要Justificacion上的ID了 con: - 您必须始终在父Justificacion上查询Asociado,但这不应该是个问题