gpt4 book ai didi

java - 从 Hibernate 文档了解双向关系

转载 作者:行者123 更新时间:2023-11-29 05:19:09 28 4
gpt4 key购买 nike

我正在浏览 Hibernate documentation for bidirectional relationship ,在文档中说:

示例 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() {
...
}

Troop has a bidirectional one to many relationship with Soldier through the troop property. You don't have to (must not) define any physical mapping in the mappedBy side.

To map a bidirectional one to many, with the one-to-many side as the owning side, you have to remove the mappedBy element and set the many to one @JoinColumn as insertable and updatable to false. This solution is not optimized and will produce additional UPDATE statements.

示例 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() {
...
}

由于我是 Hibernate 的新手,我很难理解这一点。

1) 当文档说: 您不必(不得)在 mappedBy 端定义任何物理映射。

2) 7.22 中的 @JoinColumnname 属性具有相同的值 (troop_fk)。我们可以指定不同的值吗?在这里设置 insertable=false, updatable=false 有什么优点和缺点?

有人可以解释一下吗?

最佳答案

这是一个双向关联。所以,如果一个士兵 balongs 一个队伍,这个队伍包含这个士兵。这些只是表达同一事物的两种方式。

在 Soldier 中,您告诉关联如何在数据库中表示:使用名为 troop_fk 的连接列:

@JoinColumn(name="troop_fk")
public Troop getTroop() {

因此,在这种双向关联的另一端重复相同的信息是多余的。你不能这样做。通过说

@OneToMany(mappedBy="troop")
public Set<Soldier> getSoldiers() {

您告诉 Hibernate getSoldiers() 是双向关联的反面,并且可以在 Soldier.troop 属性(property)。

关于你的第二个问题。再一次,我们的目标是定义一个单一但双向的关联。您不需要两个不同的外键来映射单个关联。因此,为连接列指定一个不同的名称是没有意义的:它会创建一个不同的、单向的关联。

据我所知,这种做法很丑陋,JPA 规范不支持它。 JPA 规范要求双向 OneToMany 关联的所有者端是多端。事实上,它创建了两个以相同方式映射的单向关联,并告诉 Hibernate(使用 insertable = false 和 updatable = false)在保存实体时忽略其中之一。当从数据库中读取士兵时,它会填充 soldier.troop ,但是在保存士兵时,无论你放入 soldier.troop 什么都会被忽略。恕我直言,您应该避免这种做法。

关于java - 从 Hibernate 文档了解双向关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25470379/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com