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

第三

我有三个具有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.EAGEROneToMany带注释的列表中的重复项多次返回子级

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

如何使用Spring Data REST和JPA维护双向关系?

来自分类Dev

如何正确管理jpa双向关系?

来自分类Dev

Spring Data JPA如何传递日期参数

来自分类Dev

无法为双向Spring Data JPA和Spring REST正确设置@ManyToMany和@OneToOne关系

来自分类Dev

Spring Data Jpa OneToMany保存双向

来自分类Dev

Spring rest + JPA + H2 @ManyToOne 双向关系。无法存储子实体

来自分类Dev

SPRING DATA JPA保存@OneToMany关系

来自分类Dev

JPA或Hibernate或Spring批注指定对关系的查询?

来自分类Dev

JPA或Hibernate或Spring批注指定对关系的查询?

来自分类Dev

JPA:了解OneToOne双向关系

来自分类Dev

Spring Data JPA查询与传递排序

来自分类Dev

Spring Data JPA如何选择/识别底层的JPA Provider?

来自分类Dev

如何在Spring JPA中注入CrudRepository?

来自分类常见问题

如何设置Spring Data JPA存储库?

来自分类Dev

如何使用XML配置Spring Data JPA

来自分类Dev

@CreatedBy在Spring Data JPA中如何工作?

来自分类Dev

(Spring JPA)如何从Delete方法获取实例

来自分类Dev

如何设置Spring Data JPA存储库?

来自分类Dev

如何在 spring mvc 中配置 JPA?

来自分类Dev

如何使用 Spring Boot 配置 JPA + HIBERNATE

来自分类Dev

Spring Data Jpa项目使用ManyToMany关系时的生成查询

来自分类Dev

GAE上的Spring框架JPA2 @OneToMany关系

来自分类Dev

Spring JPA / Hibernate @ManyToOne关系始终插入子行

来自分类Dev

Spring JPA:如果关系仍然存在,请防止删除

来自分类Dev

Spring JPA-一对多关系中的继承

来自分类Dev

Spring JPA + Hibernate OneToOne关系进行n + 1个查询

来自分类Dev

spring jpa onetomany 关系@Query 不起作用

来自分类Dev

hql选择查询spring jpa中的一对多关系

Related 相关文章

热门标签

归档