大家好,我想知道:我什么时候可以使用映射来指示哪个是由于一对一或一对多的关系 - 或与EJB3(JPA)的多对多关系映射 例 我有两张桌子A和B. 表A属于表B. 我所映射的是哪个表格?
答案 0 :(得分:6)
什么时候可以使用mapped by来指示哪个是由于一对一或一对多的关系 - 或与EJB3的多对多关系映射
关系可以是单向的,也可以是双向的。在双向关系中,您必须使用mappedBy
元素指定其他类中关系的拥有方。
从JPA 1.0规范:
2.1.7实体关系......
关系可能是双向的或 单向。双向的 关系既有自己的一面 和反面。单向的 关系只有一个拥有的一面。 关系的拥有方 确定对的更新 在数据库中的关系,如 在3.2.3节中描述。
以下规则适用于 双向关系:
- 双向关系的反面必须参考其拥有 通过使用
mappedBy
元素OneToOne
,OneToMany
或。{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
,持久性提供程序将假定存在两个独立的关系:
这通常不是您想要的,并且可能最终会出现意外行为(例如,插入多对多的重复行)。
答案 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上定义。”
通常,双向关系的拥有方是映射到包含引用另一个表的连接列的表的实体。如果您使用连接表,任何一方都可以是拥有方,只需在您的数据模型中有意义。