【问题标题】:EJB3 mapped by? whose owning of OR mapping?EJB3 由什么映射?谁拥有 OR 映射?
【发布时间】:2011-04-07 05:44:35
【问题描述】:

大家好,我想知道:我什么时候可以使用 mapped by 来指示谁是由于 EJB3 (JPA) 的一对一或一对多或多对多关系映射的关系 例子 我有两张桌子 A 和 B 表A属于表B 那么我为谁的表放置了映射?

【问题讨论】:

    标签: java orm jpa


    【解决方案1】:

    我什么时候可以使用映射依据来指示谁是由于与 EJB3 的一对一或一对多或多对多关系映射的关系

    关系可以是单向或双向的。在双向关系中,您必须在另一个类中使用mappedBy 元素指定关系的拥有方

    • 拥有方负责将关系更新传播到数据库。通常这是有外键的一面。
    • inverse 端映射到拥有端。

    来自 JPA 1.0 规范:

    2.1.7 实体关系 ...

    关系可能是双向的,也可能是 单向。一个双向 关系都有拥有的一面 和反面。单向 关系只有拥有的一面。 关系的拥有方 确定对 数据库中的关系,如 在第 3.2.3 节中描述。​​

    以下规则适用于 双向关系:

    • 双向关系的反面必须引用其拥有 同时使用mappedBy 元素 OneToOneOneToManyManyToMany 注释。这 mappedBy 元素指定 实体中的属性或字段 是关系的所有者。
    • 多方一对多/多对一双向 关系必须是拥有方, 因此 mappedBy 元素不能 在 ManyToOne 注释上指定。
    • 对于一对一的双向关系,拥有方 对应于包含的一侧 对应的外键。
    • 对于多对多双向关系,任何一方都可能是 拥有方。

    想象以下模型:

    @Entity
    public class Player {
    ...
        private Team team;
    
        @ManyToOne
        public Team getTeam() { return team; }
    
        ...
    } 
    

    还有

    @Entity
    public class Team {
        ...    
        private Set<Player> players = new HashSet<Player();
    
        public Team() { }
    
        @OneToMany(mappedBy = "team")
        public Set<Player> getPlayers() { return players; }
    
        ...    
    }
    

    在此示例中,mappedBy 属性显示Player 实例的team 属性映射到Team 实例,Team 对象的标识符将作为外键列存在于 PLAYER 表中。关系的拥有Player 方负责存储外键。

    如果不使用mappedBy,持久化提供者会假设有两个独立的关系:

    这通常不是您想要的,并且最终可能会出现意外行为(例如,以多对多插入的重复行)。

    相关问题

    参考文献

    • JPA 1.0 规范
      • 第 2.1.7 节“实体关系”

    【讨论】:

    • 非常感谢您提供如此清晰的解释
    【解决方案2】:

    当关系已经在另一部分定义时,可以使用mappedBy属性。

    例如,在实体 A 和 B 之间的一对一关系中:

    @Entity
    public class A {
    
        @OneToOne
        @JoinColumn
        private B b;
    
        // Code removed for clarity
    
    }
    

    在这里,我的 A 类定义了与 B 的关系。它是使用连接列的一对一关系。如果我希望 B 链接到 A,使用这个已经定义的关系,在我的实体之间建立双向关系,我可以使用 mappedBy 属性:

    @Entity
    public class B {
    
        @OneToOne(mappedBy="b")
        private A a;
    
        // Code removed for clarity
    
    }
    

    这里,mappedBy 属性的意思是“我想定义一个一对一的关系,它已经在实体 A 上定义,在名为 'b' 的属性上”。

    通常,双向关系的拥有方是映射到包含引用另一个表的连接列的表的实体。如果您使用连接表,任何一方都可以是拥有方,它必须在您的数据模型中有意义。

    【讨论】:

      猜你喜欢
      • 2011-02-14
      • 2011-04-16
      • 1970-01-01
      • 2016-02-05
      • 2011-06-02
      • 2017-10-24
      • 2011-04-22
      • 2012-07-13
      相关资源
      最近更新 更多