多对多关系:如何使用XML Mapping确定inverse = true的位置

时间:2012-03-16 22:25:59

标签: nhibernate orm nhibernate-mapping

我正在阅读关于一对多关系中的inverse = true,并且实际上想知道在多对多关系中将该属性设置为true的位置。 我知道逆是指出哪个实体/表是关系的所有者。在一对多的引用中,这实际上非常简单。购买如何指出多对多关系中的一方?或者没有必要吗?

你能指出双方吗?或者你必须选择一方?你如何确定哪一方是什么? 如果我认为根据关系的所有者我认为两个集合都必须设置inverse = true,因为它们都不是关系的所有者。但实际上另一个也不是主人。它是所有者的UsersTargets表。 有人能让我离开我的mysery吗?

例如:用户可以获得许多奖项。 注意:没有必要知道有多少用户拥有特定奖励。那么也许我应该让我的模型与众不同?无论如何我的代码到现在为止:

域:

public class User : Entity
{
    ...
    public virtual ISet<Award> Awards { get; set; }
}

public class Award : Entity
{
    ...
    public virtual ISet<User> Users { get; set; }
}

映射:

<-User.hbm.xml->
<set name="Awards" table="UsersAwards" cascade="all">
    <key column="UserId"/>
    <many-to-many class="Award" column="AwardId"/>
</set>

<-Award.hbm.xml->
<set name="Users" table="UsersAwards" cascade="all">
    <key column="AwardId"/>
    <many-to-many class="User" column="UserId"/>
</set>
提前谢谢。

2 个答案:

答案 0 :(得分:4)

关系的一方应该标记为inverse。这意味着,如果您决定从模型中删除Award.Users属性,请确保Users.Awards未标记为inverse

如果您将两个集合都留在模型中,并使用这样的代码添加/删除关联......

public class User
{
    public virtual void Add(Award award)
    {
        award.Users.Add(this);
        Awards.Add(award);
    }

    public virtual void Remove(Award award)
    {
        Awards.Remove(award);
        award.Users.Remove(this);
    }
}

...那么你把inverse放在哪一边并不重要 - 只要确保一方拥有它而另一方没有。

答案 1 :(得分:3)

您应将不用于更新的一侧设置为inverse

在您的情况下,您可能会向用户添加奖励,而不是奖励的用户。因此,Award.UserAwards将是inverse

当然,如果你而不是将用户添加到奖励中,只需改回我刚才所说的内容。