EJB3映射?谁拥有OR映射?

时间:2010-09-02 09:07:39

标签: java orm jpa

大家好,我想知道:我什么时候可以使用映射来指示哪个是由于一对一或一对多的关系 - 或与EJB3(JPA)的多对多关系映射 例 我有两张桌子A和B. 表A属于表B. 我所映射的是哪个表格?

2 个答案:

答案 0 :(得分:6)

  

什么时候可以使用mapped by来指示哪个是由于一对一或一对多的关系 - 或与EJB3的多对多关系映射

关系可以是单向的,也可以是双向的。在双向关系中,您必须使用mappedBy元素指定其他类中关系的拥有方

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

从JPA 1.0规范:

  

2.1.7实体关系......

     

关系可能是双向的或   单向。双向的   关系既有自己的一面   和反面。单向的   关系只有一个拥有的一面。   关系的拥有方   确定对的更新   在数据库中的关系,如   在3.2.3节中描述。​​

     

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

     
      
  • 双向关系的反面必须参考其拥有   通过使用mappedBy元素   OneToOneOneToMany或。{   ManyToMany注释。该   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,持久性提供程序将假定存在两个独立的关系:

2 unidirectional relations

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

相关问题

参考

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

答案 1 :(得分: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属性意味着“我想在名为'b'的属性上定义一对一关系,该关系已在实体A上定义。”

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