0

私は次の表を持っています:

foo {
    id;
    catColorId;
}

bar {
    fooId;
    catTypeId;
    barName;
}

cat {
     catColorId;
     catTypeId;
     priority;
}

barテーブルにはcomposite-idがありfooId, catTypeId
catますテーブルにはcomposite-idがありますcatColorId, catTypeId

それらを次のようにマッピングしたいと思います。

class Foo {
    int Id;
    IList<Bar> BarList { get; set; }
}

BarListcat.priorityで注文する必要があります

これを.hbm.xmlにマッピングする方法はありますか?

アップデート:

Foo.BarListに入力すると、クエリ(またはそのバリエーション)が生成されるマッピングを取得できれば完璧です。

select 
    b.fooId, 
    b.catTypeId,
    b.barName,
from
    join foo as f 
    join bar as b on f.id = b.fooId
    join cat as c on f.catColorId = c.catColorId and b.catTypeId = c.catTypeId
where
    f.id = @fooId
order by 
    c.priority

私はその最後の結合に問題があります:b.catTypeId = c.catTypeId
hbmマークアップでそのような制限をどのように定義しますか?

4

1 に答える 1

1

現状の例は、厳密にはMany-To-Manyマッピングです。

public class Foo {
    public virtual int Id { get; set; }
    public virtual IList<Cat> Cats { get; set; }
}

// there is no Bar entity in this example; it is a cross-reference table used by nhibernate, but there is no entity in your domain

public class Cat {
    public virtual int Id { get; set; }
    public virtual IList<Foo> Foos { get; set; }
}

マッピング:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    assembly="Models"
    namespace="Models">
    <class name="Foo" table="foo">
        <id name="Id" column="Id">
            <generator class="identity" />
        </id>
        <bag name="Cats" table="bar">
            <key column="FooId"></key>
            <many-to-many column="CatId" class="Cat" />
        </bag>
    </class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    assembly="Models"
    namespace="Models">
    <class name="Cat" table="cat">
        <id name="Id" column="Id">
            <generator class="identity" />
        </id>
        <bag name="Foo" table="bar">
            <key column="CatId"></key>
            <many-to-many column="FooId" class="Foos" />
        </bag>
    </class>
</hibernate-mapping>

ただし、FoosとCatsの関係が単なる関係よりも意味がある場合(たとえば、Barに属性を追加する必要がある場合)、次のようにします。

public class Foo {
    public virtual int Id { get; set; }
    public virtual IList<Bar> Bars { get; set; }
}

public class Bar
{
    public virtual Foo Foo { get; set; }
    public virtual Cat Cat { get; set; }
}

public class Cat {
    public virtual int Id { get; set; }
    public virtual IList<Bar> Bars { get; set; }
}
// you can get all Cats for a Foo via Foo.Bars and vice versa

マッピング:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    assembly="Models"
    namespace="Models">
    <class name="Foo" table="foo">
        <id name="Id" column="Id">
            <generator class="identity" />
        </id>
        <bag name="Bars" inverse="true">
            <key column="CatId"></key>
            <one-to-many class="Bar"/>
        </bag>
    </class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    assembly="Models"
    namespace="Models">
    <class name="Cat" table="cat">
        <id name="Id" column="Id">
            <generator class="identity" />
        </id>
        <bag name="Bars" inverse="true">
            <key column="FooId"></key>
            <one-to-many class="Bar"/>
        </bag>
    </class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    assembly="Models"
    namespace="Models">
    <class name="Bar" table="bar">
        <composite-id>
          <key-many-to-one class="Foo" name="Foo" column="FooId" />
          <key-many-to-one class="Cat" name="Cat" column="CatId" />
        </composite-id>
    </class>
</hibernate-mapping>

私のHBMマークアップが錆びている場合は申し訳ありません。私はコードによるマッピングに慣れています。

于 2012-06-12T07:13:38.863 に答える