我正在浏览双向关系的Hibernate文档,在文档中它说:
示例7.21。双向一对多,多到一方作为关联所有者
@Entity
public class Troop {
@OneToMany(mappedBy="troop")
public Set<Soldier> getSoldiers() {
...
}
@Entity
public class Soldier {
@ManyToOne
@JoinColumn(name="troop_fk")
public Troop getTroop() {
...
} 部队通过部队财产与士兵有双向的一对多的关系。您不必(不能)在mappedBy端定义任何物理映射。 要将一对多的双向元素映射为多个,以一对多的一方作为拥有方,您必须删除mappedBy元素,并将多个元素设置为一个@JoinColumn,作为可插入的,并可更新为false。此解决方案未进行优化,将产生其他更新语句。
示例7.22。作为所有者的一对多方的双向关联
@Entity
public class Troop {
@OneToMany
@JoinColumn(name="troop_fk") //we need to duplicate the physical information
public Set<Soldier> getSoldiers() {
...
}
@Entity
public class Soldier {
@ManyToOne
@JoinColumn(name="troop_fk", insertable=false, updatable=false)
public Troop getTroop() {
...
}我发现很难理解这一点,因为我刚开始冬眠。
1)当医生说:You don't have to (must not) define any physical mapping in the mappedBy side.是什么意思?
2) 7.22中的@JoinColumn对于name属性具有相同的值(troop_fk)。我们可以指定不同的值吗?在这里设置insertable=false, updatable=false的优点和缺点是什么?
谁能解释一下吗?
发布于 2014-08-24 10:08:38
是双向关联。因此,如果一名士兵向一支部队低头,那么这支部队就包含了该名士兵。这只是说同一件事的两种方式。
在Soldier中,您将告诉如何在数据库中表示关联:使用名为troop_fk的联接列:
@JoinColumn(name="troop_fk")
public Troop getTroop() {因此,在双向关联的另一端重复相同的信息是多余的。你不能这么做。通过说
@OneToMany(mappedBy="troop")
public Set<Soldier> getSoldiers() {您告诉Hibernate,getSoldiers()是双向关联的反面,映射该关联的方式可以在Soldier.troop属性上找到。
关于你的第二个问题。再一次,我们的目标是定义一个单一但双向的关联。映射单个关联不需要两个不同的外键。因此,为join列指定不同的名称是没有意义的:它将创建一个不同的单向关联。
这种做法是一种丑陋的攻击,AFAIK不受JPA规范的支持。JPA规范要求双向OneToMany关联的所有者方是多个方。实际上,它创建了两个以相同方式映射的单向关联,并告诉Hibernate (使用插入= false和updatable = false)在保存实体时忽略其中的一个。当从数据库中读取士兵时,它将填充soldier.troop,但是在保存士兵时,您放入soldier.troop中的任何内容都将被忽略。你应该避免这样做,IMHO。
https://stackoverflow.com/questions/25470379
复制相似问题