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

标签 java hibernate

我正在浏览 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/

相关文章:

java - 如何使用动态batch_size(即batch_size未知)的JpaRepository进行批量插入

java - 将带有列表的 hibernate POJO 隐藏为可序列化的 rpc 返回对象

java - 带有 PI4J 库的 Maven 项目 - 打开 zip 文件时出错

java - 持久通知的前台服务

java - 没有定义名为 'persistenceUnit' 的 bean

java - 单元测试期间无法加载ApplicationContext

java - Hibernate:如何设置整数字段的长度

java - cmd 无法获取正在监听端口 8080 的内容

java - 如何将自定义 jar 文件添加到 pom.xml 中

java - 在 Groovy 中重新加载类