Java spring jpa-如何保持可传递的双向关系

Java spring jpa-如何保持可传递的双向关系,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我有三个等级A、B、C,它们有一对夫妻关系 A-B-C代码: 但当我试图从存储库中获取数据时,出现了一些问题: 这些测试正常: assertThat(cRepository.findOne(1l)).isNotNull(); assertThat(cRepository.findOne(1l).getB()).isNotNull(); assertThat(cRepository.findAll()).hasSize(9); assertThat(bReposit

我有三个等级A、B、C,它们有一对夫妻关系 A-B-C代码:

但当我试图从存储库中获取数据时,出现了一些问题:

这些测试正常:

    assertThat(cRepository.findOne(1l)).isNotNull();
    assertThat(cRepository.findOne(1l).getB()).isNotNull();
    assertThat(cRepository.findAll()).hasSize(9);
    assertThat(bRepository.findAll()).hasSize(2);
    assertThat(bRepository.findOne(1l).getCList().size()).isEqualTo(9);
但这一次失败了:

    assertThat(aRepository.findOne(1l).getBList().size()).isEqualTo(2);

它返回10条记录。Query SELECT*FROM B,其中A_ID=1返回2条记录,因此您能否说明我做错了什么?

您需要将其更改为以下内容:

B b1 = new B();
b1.setName("B-1");
b1.setA(a);
a.getBList().add(b1);
bRepository.save(b1);

B b2 = new B();
b2.setName("B-2");
b2.setA(a);
a.getBList().add(b2);
bRepository.save(b2);
aRepository.save(a);
现在是我这边的一些信息。理论上,它也可以在没有额外三行的情况下工作,但前提是使hibernate缓存无效。我想如果你拆下a,dann得到a,它可能会返回正确的结果。一般建议,尽可能避免双向映射。如果您需要,请在

public void addB(B b) {
    b.setA(this);
    a.getBList().add(b);
}

与许多人有关。无需添加即时抓取,因为这是默认值。

其奇怪的休眠行为是因为即时类型使用外部联接。对于与B相关的每个C对象,您都会得到重复的B对象。我有类似的问题,我找到的唯一解决方案是将fetchType更改为LAZY或将List更改为Set


这里有更好的解释:或者

显然它不起作用。我还有10张唱片。1它应该如何工作?我认为当我将对象保存到存储库时,双向关系会被更新。事实上,数据库已经更新了,但在代码中却没有更新。2.为什么通过添加相同的对象B-1来多次更新a.bList?当我从存储库中获取对象A-1时,cList包含9x对象B-1和一个对象B-2。为什么当我保存C-x对象时,B-1被添加到A-1 cList?gunr2171已经对其进行了编辑,这只是一个打字错误。有关10个enty的问题,请参阅jgr的答案。老实说,我10岁的时候错过了这一点,并在那所学校停止了阅读
    assertThat(aRepository.findOne(1l).getBList().size()).isEqualTo(2);
B b1 = new B();
b1.setName("B-1");
b1.setA(a);
a.getBList().add(b1);
bRepository.save(b1);

B b2 = new B();
b2.setName("B-2");
b2.setA(a);
a.getBList().add(b2);
bRepository.save(b2);
aRepository.save(a);
public void addB(B b) {
    b.setA(this);
    a.getBList().add(b);
}