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

Hibernate获取模式。使用Spring Data JPA忽略SUBSELECT

秋博容
2023-03-14

我们有一个实体树,由一个父实体组成,该父实体与一个子实体具有多对多关系,如下所述(在kotlin中)。为什么hibernate似乎忽略了与实体关系关联的FetchMode?

观察到的行为:在父级FetchMode的JpaRepository上执行findAll时。忽略SUBSELECT,Hibernate为每个父级触发一个新的选择来获取子级。

预期行为:在父节点的JpaRepository上执行findAll时,hibernate会触发一个带有子选择的选择,以获取所有父节点的子节点。

技术:带Spring boot启动器数据jpa的Spring boot 2.4.2

@Entity
@Table(name = "parent")
class Parent (
    @Id
    @SequenceGenerator(
        name = "parent",
        sequenceName = "parent_id_seq",
        allocationSize = 50
    )
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "parent_generator")
    val id: Long? = null

    @Fetch(SUBSELECT)
    @ManyToMany
    @JoinTable(
        name = "parent_child",
        joinColumns = [JoinColumn(name = "parent_id")],
        inverseJoinColumns = [JoinColumn(name = "child_id")]
    )
    val children: MutableList<Child>
)

@Entity
@Table(name = "child")
class Parent (
    @Id
    @SequenceGenerator(
        name = "parent",
        sequenceName = "parent_id_seq",
        allocationSize = 50
    )
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "parent_generator")
    val id: Long? = null
)

共有1个答案

鲁羽
2023-03-14

我不确定,但也许Hibernate只是不能使用SUBSELECT抓取,因为你正在建模一个包。如果您使用Set而不是MutableList,它是否工作?

 类似资料:
  • 我正在测试JPA2。1和新的“模式生成”功能。为此,我在HyperSQL数据库下测试了两个实现: Eclipse Link 2.5.2-M1,它是参考实现。 Hibernate4.3 我对实现没有任何偏好(甚至对性能也没有偏好)。我测试了EclipseLink,因为它是第一个JPA2。1实现可用,但现在,Hibernate4.3在这里,JPA2也在这里。1合规。我唯一想要的是获得独立于JPA提供者

  • 问题内容: 这是我的实体: 这是我获得人员名单的方式: 如果我正确理解提取图,则它必须仅加载我指定的那些字段。但是,字段“ birthDate”也已加载。此外,我看到在hibernateSQL查询中选择了4列。 如何解决?我使用hibernate 5.1.0作为JPA提供程序。 问题答案: 实体图旨在控制延迟或渴望加载哪些关系(例如,一对一,一对多等)。它们可能不适用于加载各个列(取决于提供程序)

  • 该字段“auftragsnummer”始终保持为空,即使它用@GeneratedValue进行了注释: 我使用存储它。引用的生成器类实现。我不知道为什么它被忽视了。 环境: Hibernate5.0.1 Spring 4.2.1 Java 7 DB2 10

  • 问题内容: 如何保存hibernate实体并忽略(不正确)瞬态模式。 例如: 我想保存它: 弹簧产生错误: 问题答案: 参见http://docs.jboss.org/hibernate/validator/4.2/reference/en- US/html_single/#validator-checkconstraints- orm 。默认情况下,Hibernate(ORM)检查默认验证组的每

  • 这是我的实体: 这是我如何得到的人的名单: 如果我正确理解fetch graph,它必须只加载我指定的字段。但是,“生日”字段也会被加载。此外,我看到在hibernate sql查询中选择了4列。 如何修复它?我使用Hibernate5.1.0作为JPA提供程序。

  • 问题内容: 这个问题本质上是相反的这一个 我有这样的方法: 当我加载它时,Hibernate抱怨我没有称为的属性。但是我不想要一个叫做-我不需要存储数据的属性-这仅仅是逻辑。 hibernate状态: org.hibernate.PropertyNotFoundException:在com.mycomp.myclass类中找不到空置属性的设置器… 我可以在方法中添加注释以使Hibernate忽略它