当前位置: 首页 > 知识库问答 >
问题:

从HiberNate留档理解双向关系

方季同
2023-03-14

我正在浏览关于双向关系的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 side中定义任何物理映射。

要将双向一对多映射为一对多,并将一对多的一端作为拥有端,您必须删除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) 当doc说:你不必(一定不能)在mappedBy中定义任何物理映射时,这意味着什么

2) 7.22中的@JoinColumn对于名称属性具有相同的值(force_fk)。我们可以指定不同的值吗?优势是什么

有人能解释一下吗?


共有1个答案

蓬英逸
2023-03-14

这是一个双向的联系。所以,如果一个士兵和一个部队在一起,这个部队就包含了这个士兵。这只是同一件事的两种说法。

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

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

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

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

你告诉Hibernate,get士兵()是双向关联的反面,这个关联的映射方式可以在士兵上找到。部队财产。

关于你的第二个问题。同样,目标是定义一个单一的双向关联。映射一个单一的关联不需要两个不同的外键。所以为连接列指定不同的名称是没有意义的:它会创建一个不同的单向关联。

这种做法是一种丑陋的黑客攻击,而且JPA规范不支持这种攻击。JPA规范要求双向OneToMany关联的所有者方是多方。实际上,它创建了两个以相同方式映射的单向关联,并告诉Hibernate(使用insertable=false和Updateable=false)在保存实体时忽略其中一个。它将在士兵中占据一席之地。当从数据库中读取士兵时,但无论你在士兵中输入了什么。拯救士兵时,军队将被忽略。你应该避免这种做法,伊姆霍。

 类似资料:
  • 问题内容: 我有2个类:User和UserPicture具有1:1的关系。 UserPicture中的“ user”将被加载,而UserPicture中的“ userPicture”则不会加载-我错了吗? 编辑 必须添加,我只是创建一个UserPicture并插入它们(使用现有的userId)-也许我需要在UserPicture中级联“ user”? 问题答案: 您必须映射您的课程。

  • 1. 前言 通过本节课程的学习,你将发现关联对象之间的微妙关系。相信这种关系对你更深入地认识 HIbernate 有很大的帮助。 通过本节课程,你将了解到: 多对多双向关联映射中哪一方是关系维系者; 级联操作与关系维系者。 2. 关系维系者 新学期开始了,同学们选择了各自喜欢的课程,现在为学生添加选修课程的任务就要落在 Hibernate 的身上。一起来看看 Hibernate 是如何完成这个任务

  • 1. 前言 本节课程和大家一起聊聊一对多关联映射。通过本节课程,你将了解到: 如何实现一对多关联映射; 如何实现双向一对多关联映射; 关联映射中的级联操作。 2. 一对多关联映射 关系型数据库中表与表中的数据存在一对多(或多对一)关系。 如学生表、班级表。一个班级有多个学生,多个学生可以在同一个班级。 一对多或多对一本质上是一样的,如同一块硬币的正面和反面,只是看待事物的角度不同而已。 数据库中有

  • 我有两张桌子。后 和喜欢 在这些对象之间进行hibernate注释映射,以便在类似于Post bean的。。。。 就像豆子一样 问题 该关联是否由Post{@OneToOne}和like{@ManyToOne}正确? 获取类型是Lazy,但仍然得到依赖循环。为什么? 尝试 要删除依赖关系循环,我尝试了 {@xmltransive} {@JsonIgnore} {@JsonManagedRefere

  • 本文向大家介绍详解hibernate双向多对多关联映射XML与注解版,包括了详解hibernate双向多对多关联映射XML与注解版的使用技巧和注意事项,需要的朋友参考一下 双向多对多关联映射原理: 假设,一个员工可能有多个角色,一个角色可能有多个员工,从员工或角色的角度看,这就是多对多的关系,不管从哪一个角度看,都是多对多的联系。多对多关联映射关系一般采用中间表的形式来实现,即新增一种包含关联双方

  • 我试图在用户和地址之间建立双向关系, 用户1-------->*地址 但是 地址1-------->1个用户 我在上网时得到了这些信息 > 对于一对一双向关系,拥有方对应于包含对应外键的方 双向关系的反向侧必须通过使用OneToOne、 OneToMany或ManyToMany批注的mappedBy元素来引用其 所属侧。mappedBy元素指定作为 关系所有者的实体中的属性或字段。 但如果我按照情