当前位置: 首页 > 面试题库 >

保存双向ManyToMany

冯淳
2023-03-14
问题内容

我有两个以下列方式注释的实体类

@Entity
class A {
   @ManyToMany(mappedBy="A", cascade=CascadeType.ALL)
   private List<B> b;
 ..
}

@Entity
class B {
   @ManyToMany(cascade=CascadeType.ALL)
   private List<A> a;
 ..
}

如果我存储类“ B”的实例,则关系将存储在数据库中,并且类“ A”中的吸气剂将返回B的正确子集。但是,如果我对“
A”中的B列表进行了更改,更改是否不存储在数据库中?

我的问题是,我该如何做到使任一类的更改都“级联”到另一类?

编辑:我尝试过删除mapedBy参数和定义JoinTable(和列)的不同变体,但我一直找不到正确的组合。


问题答案:

最短的答案似乎是你做不到,这很有意义。在双向多对多关联中,一侧必须是主端,用于将更改持久保存到基础联接表。由于JPA不会维护关联的双方,因此您可能会遇到一种内存情况,一旦存储在数据库中就无法重新加载。例:

A a1 = new A();
A a2 = new A();
B b = new B();
a1.getB().add(b);
b.getA().add(a2);

如果可以保持此状态,那么您将在连接表中得到以下条目:

a1_id, b_id
a2_id, b_id

但是在加载时,JPA怎么会知道您打算只让b知道a2而不是a1?那不知道b的a2呢?

这就是为什么您必须自己维护双向关联(并使上面的示例即使在内存中也无法访问)的原因,而JPA只会根据其一侧的状态而持久。



 类似资料:
  • 我有一个MIPS 64位架构的缓存,每个块4KB的2路和16个字的行(每个块)。我必须确定: > [标记|索引|偏移] 每个字段的位大小 整个内存由多少位组成? 我不知道我所做的是否正确,因为我没有结果,因为我们使用的是64位MIPS而不是32位,我认为一个单词应该由8个字节而不是4个字节组成。 我通过执行4KB/(16个字*8个字节)计算了块的数量 然后我完成了=- 然后我得到字和字节偏移量,如

  • 问题内容: 我们的应用程序使用无限滚动来浏览大量异构项目列表。有一些皱纹: 对于我们的用户来说,通常有10,000个项目的列表,并且需要滚动3k +。 这些都是丰富的项目,因此在浏览器性能变得无法接受之前,我们只能在DOM中拥有几百个。 这些物品的高度各不相同。 这些项目可能包含图像,我们允许用户跳转到特定日期。这很棘手,因为用户可以跳到列表中需要在视口上方加载图像的位置,这会在加载时将内容下推。

  • 如果是使用Spring数据/JPA的拥有方,用双向关系表示下表的最佳方式是什么?我希望能够使用保存,并保存。 节点表 身份证 node_node表 > 节点标识2 这是我到目前为止所拥有的。以为拥有方的双向关系,这意味着当我在

  • 我在和实体之间有以下一对一的关系: 和 这一切工作得很好,但是如果我添加到类中的字段,并调用,则会失败: 原因:javax。坚持不懈RollbackException:在组织提交事务时出错。冬眠内部的例外情况ConverterImpl。org上的ConvertCommitteException(ExceptionConverterImpl.java:77)。冬眠发动机交易内部的Transactio

  • 本文向大家介绍双向链表和双向循环链表?相关面试题,主要包含被问及双向链表和双向循环链表?时的应答技巧和注意事项,需要的朋友参考一下 双向链表: 包含两个指针,一个prev指向前一个节点,一个next指向后一个节点。 双向循环链表: 最后一个节点的 next 指向head,而 head 的prev指向最后一个节点,构成一个环。

  • 所以我用下面的方法设置了摄像头- 如您所见,我在摄像机参数上使用了setRoation()来实际指定图像方向,并在摄像机本身上使用了setDisplayOriation()来处理表面预览中的方向更改。(注释和未注释的代码似乎都没有保留方向。当我检查数据时,它返回0) 之后,在回调中,我甚至尝试使用矩阵保存具有方向的图像。 实际问题 > 当我在肖像模式下拍照时,一切正常。它看起来像是被拿走了。 但是