【发布时间】:2011-04-07 05:44:35
【问题描述】:
大家好,我想知道:我什么时候可以使用 mapped by 来指示谁是由于 EJB3 (JPA) 的一对一或一对多或多对多关系映射的关系 例子 我有两张桌子 A 和 B 表A属于表B 那么我为谁的表放置了映射?
【问题讨论】:
大家好,我想知道:我什么时候可以使用 mapped by 来指示谁是由于 EJB3 (JPA) 的一对一或一对多或多对多关系映射的关系 例子 我有两张桌子 A 和 B 表A属于表B 那么我为谁的表放置了映射?
【问题讨论】:
我什么时候可以使用映射依据来指示谁是由于与 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,持久化提供者会假设有两个独立的关系:
这通常不是您想要的,并且最终可能会出现意外行为(例如,以多对多插入的重复行)。
【讨论】:
当关系已经在另一部分定义时,可以使用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' 的属性上”。
通常,双向关系的拥有方是映射到包含引用另一个表的连接列的表的实体。如果您使用连接表,任何一方都可以是拥有方,它必须在您的数据模型中有意义。
【讨论】: