我有三个具有OneToMany关系A <>-- B <>-- C
代码的类(A,B,C):
@Getter @Setter
@Entity
public class A {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "a")
private List<B> bList;
private String name;
}
@Getter @Setter
@Entity
public class B {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne(fetch = FetchType.EAGER)
private A a;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "b")
private List<C> cList;
private String name;
}
@Getter @Setter
@Entity
public class C {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
@ManyToOne(fetch = FetchType.EAGER)
private B b;
}
我应该如何正确填充数据?当我尝试这样的事情时:
A a = new A();
a.setName("A-1");
aRepository.save(a);
B b1 = new B();
b1.setName("B-1");
b1.setA(a);
bRepository.save(b1);
B b2 = new B();
b2.setName("B-2");
b2.setA(a);
bRepository.save(b2);
for (int i = 1; i <= 9; i++ ) {
C c = new C();
c.setName("C-"+i);
c.setB(b1);
cRepository.save(c);
}
我在数据库中获得了正确填充的数据:
+----+------+
| ID | NAME |
+----+------+
| 1 | A-1 |
+----+------+
+----+------+------+
| ID | NAME | A_ID |
+----+------+------+
| 1 | B-1 | 1 |
+----+------+------+
| 2 | B-2 | 1 |
+----+------+------+
+----+------+------+
| ID | NAME | B_ID |
+----+------+------+
| 1 | C-1 | 1 |
+----+------+------+
| 2 | C-2 | 1 |
+----+------+------+
| 3 | C-3 | 1 |
+----+------+------+
| 4 | C-4 | 1 |
+----+------+------+
| 5 | C-5 | 1 |
+----+------+------+
| 6 | C-6 | 1 |
+----+------+------+
| 7 | C-7 | 1 |
+----+------+------+
| 8 | C-8 | 1 |
+----+------+------+
| 9 | C-9 | 1 |
+----+------+------+
但是,当我尝试从存储库中获取数据时,出现了错误:
这些测试是可以的:
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条记录。查询SELECT * FROM B WHERE A_ID = 1
返回2条记录,所以您能说明我做错了什么吗?
其奇怪的休眠行为是由于使用OUTER JOINS的EAGER类型导致的。对于与B相关的每个C对象,您都会获得重复的B对象。我遇到了类似的问题,而我发现的唯一解决方案是将fetchType更改为LAZY或将List更改为Set。
在这里,您可以得到更好的解释:休眠条件使用FetchType.EAGER或OneToMany带注释的列表中的重复项多次返回子级
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句