【问题标题】:How is the "Owning Side" of this many-to-many relationship determined?这种多对多关系的“拥有方”是如何确定的?
【发布时间】:2014-03-25 23:17:59
【问题描述】:

我正在尝试牢牢掌握 Owning-side 的概念。从我在这里找到的任何问题中都无法真正得到清晰的画面。基本上我正在阅读 Java EE JPA 教程。它们具有以下数据库架构,其中 PLAYERTEAM 具有多对多关系


还有说明

  • 一名球员可以加入多支球队。
  • 一个团队可以有很多玩家。
  • PLAYERTEAM 之间存在多对多关系。

到目前为止非常简单。但是当涉及到编码部分时,他们使TEAM 成为关系的拥有方。

public class Team {
    private Collection<Player> players;

    @ManyToMany
    @JoinTable(
            name = "PERSITENCE_ROSTER_TEAM_PLAYER",
            joinColumns = @JoinColumn(name = "TEAM_ID", referencedColumnName = "ID"),
            inverseJoinColumns = @JoinColumn(name = "PLAYER_ID", referencedColumnName = "ID")
    )
    public Collection<Player> getPlayers() {
        return players;
    }
}

public class Player {
    private Collection<Team> teams;

    @ManyToMany(mappedBy = "players")
    public Collection<Team> getTeams() {
        return teams;
    }
}

问题

我理解代码没有问题。我无法处理的是:

1.如何确定TEAM 是拥有方?

2。在这种情况下,如果将 PLAYER 设为拥有方,会有什么不同吗?

教程中也有说明。

"指定@JoinTable 的实体是 关系,因此TEAM 实体是与PLAYER 实体的关系的所有者。”

话虽如此:

3.上述陈述会使我的第二个问题成立吗?这意味着除了您决定使用@JoinTable注解的拥有方之外,没有其他决定因素?

【问题讨论】:

    标签: java entity-framework jpa orm


    【解决方案1】:
    1. 如何确定 TEAM 为拥有方?

    在双向场景中的多对多关系的情况下,可以任意选择关系的所有者,但考虑到目的,您应该选择更有意义的实体以首先检索或根据您的需求选择更常用的实体目的。您只需要记住,在 ManyToOne 场景中,Many 始终需要成为拥有方。

    1. 在这种情况下,如果让 PLAYER 成为拥有方,会有什么不同吗?

    不,它不会,因为关系是双向的。

    1. 上述陈述是否会使我的第二个问题成立?这意味着除了您决定的决定因素之外,没有其他决定因素 使用@JoinTable 注释创建拥有方?

    是的,@JoinTable 必须像其他一些注解一样在关系的所有者中。选择所有者后,您应该在该类中添加注释。

    如果应用,还要考虑级联操作,如果需要在关系的两边。

    【讨论】:

      【解决方案2】:

      根据您的问题,您使用双向的ManyToMany关系。这是我的答案,

      对于问题 1

      • 根据数据库设计,确定TEAM是ownerside。

      关于问题 2

      • 如果将 PLAYER 设为拥有方,则没有区别,在 这种情况。见this documentation

      关于问题 3

      1. 这取决于您的数据库设计。

      【讨论】:

      • 是什么,从模式图像中,让您说Team 确定为拥有方?
      • @peeskillet 根据我的观点,我假设球队有很多球员。或者你可以假设一个球员有很多球队。这取决于程序逻辑。
      • 它比当时的数据模型更符合现实生活。球队有球员;)这又回到了另一个声明中:你自己决定拥有方是什么。从 JPA 的角度来看,M:N 关系中没有拥有方。
      【解决方案3】:

      AFAIK 你可以确定拥有方。在 m:n 场景中选择任何特定的一方都没有错。

      所以,回答你的问题:

      1. 如何确定 TEAM 为拥有方?

      我认为是任意的。

      2 。在这种情况下,如果让 PLAYER 成为拥有方,会有什么不同吗?

      不会有任何区别

      3 .上述陈述会使我的第二个问题成立吗?这意味着除了您决定使用@JoinTable 注释的拥有方之外,没有其他决定因素?

      是的

      【讨论】:

        猜你喜欢
        • 2014-01-26
        • 1970-01-01
        • 2011-07-12
        • 2013-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-13
        • 2018-03-15
        相关资源
        最近更新 更多