hibernate:如何用一对多关系表示多对多关系



我在网上读过一篇文章(我再也找不到那篇文章供我参考了),多对多关系可以用一对多关系代替。有人能举个例子吗?

我刚想到这个问题,就意识到没有答案。这是一个耻辱,虽然我经常指出这条NHibernate文档声明:最佳实践

不要使用外部关联映射

真正的多对多关联的好用例很少。大部分的此时需要将额外的信息存储在"链接表"中。在这种情况下,最好使用两个一对多关联来中间链接类。事实上,我们认为大多数联想是一对多和多对一,在使用any其他关联样式,并问自己是否真的有必要。

看一下23.2下面的例子。作者/工作。AuthorWork之间多对多关系的简化版本:

<class name="Work" table="works" ...>
        <id name="Id" column="id" generator="native" />
        ...
        <set name="Authors" table="author_work" lazy="true">
            <key>
                <column name="work_id" not-null="true"/>
            </key>
            <many-to-many class="Author">
                <column name="author_id" not-null="true"/>
            </many-to-many>
        </set>
</class>

及其多对多目标Author:

<class name="Author" table="authors">
  ...
  <set name="Works" table="author_work" inverse="true" lazy="true">
     <key column="author_id"/>
     <many-to-many class="Work" column="work_id"/>
  </set>
</class>

所以,如果我们想订购一组负载的作品,我们确实有问题。pair表中没有列。但更重要的是,没有办法管理这样一个列。

我们可以做的是引入Pair对象:AuthorWork并根据需要扩展Pair表

public class AuthorWork
{
    public virtual Author Author { get; set; }
    public virtual Work Work { get; set; }
    public virtual int OrderBy { get; set; }
}

AuthorWork

<class name="AuthorWork" table="author_work">
    ...
    <many-to-one name="Author" column="author_id" />
    <many-to-one name="Workr"  column="work_id" />
    <property name="OrderBy" />

有了这个,我们可以将多对多映射转换为一对多,例如Authors集合:

<set name="Authors" lazy="true"
  order-by="OrderBy">
  <key column="work_id" not-null="true"/>
  <one-to-many class="AuthorWork" />
</set>

我们可以管理实体AuthorWork,设置OrderBy列,从而有效地处理配对表。

注意:必须同意文档中的建议,需求越多,我们就越高兴,因为我们确实有一种管理关系的方法!

最新更新