gpt4 book ai didi

hibernate - 使用 Spring Data JPA 的连接继承时避免跨表的外部连接

转载 作者:行者123 更新时间:2023-12-04 15:00:29 29 4
gpt4 key购买 nike

考虑 Spring Data JPA (+ Hibernate) 应用程序中的以下类:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "person")
public class Person { }

@Entity
@Table(name = "customer")
public class Customer extends Person { }

@Entity
@Table(name = "employee")
public class Employee extends Person { }

@Entity
@Table(name = "manager")
public class Manager extends Employee { }

public interface IPersonRepository extends JpaRepository<Person, Long> { }
public interface ICustomerRepository extends JpaRepository<Customer, Long> { }
public interface IEmployeeRepository extends JpaRepository<Employee, Long> { }

我最常见的用例涉及调用以下方法(继承自 JpaRepository ):
IPersonRepository.findAll();

每当调用此方法时,Hibernate 都会发出以下 SQL 查询:
select
person0_.id as id1_3_,
person0_.version as version2_3_,
person0_.first_name as first3_3_,
person0_.last_name as last4_3_,
person0_1_.customer_code as customer1_0_,
person0_2_.employee_code as employee1_1_,
person0_2_.manager_id as manager3_1_,
case
when person0_3_.id is not null then 3
when person0_1_.id is not null then 1
when person0_2_.id is not null then 2
when person0_.id is not null then 0
end as clazz_
from
person person0_
left outer join
customer person0_1_
on person0_.id=person0_1_.id
left outer join
employee person0_2_
on person0_.id=person0_2_.id
left outer join
manager person0_3_
on person0_.id=person0_3_.id;

每当执行此查询时,我只对 Person 中的公共(public)字段感兴趣。类,所以我发现左外连接没用。

问题是在我们的实际应用中,像 Employee这样的子类有8个。和 Customer每个子表中有数百万条记录,这导致父表上的查询运行非常缓慢。

在这种情况下,有没有办法避免跨表的外部连接?请注意,我已尝试使用 DiscriminatorColumn 方法并且在这种情况下仍然执行连接(使用 Hibernate 时)。我也尝试过特定于 Hibernate 的 Polymorphism 在所有可能的组合中对实体类进行注释,并且仍然执行外部连接。
Spring Data JPA version: 1.2.0
Hibernate version: 4.2.1

最佳答案

经过多日尝试解决这个问题,我得出以下结论:

  • 在这种情况下,无法强制 Hibernate 4.x(和 3.x)不执行外部连接。
  • 没有办法强制 TopLink Essentials (v2.1-60) 和 OpenJPA (v2.2.2) 的最新可用版本也不执行外连接。
  • 使用最新可用版本的 EclipseLink (v2.5.0) 可以避免外部连接。但是,EclipseLink 需要上面显示的类层次结构的鉴别器列,即使 Hibernate 和 OpenJPA 不需要。到目前为止,我一直无法找到避免将鉴别器列与 EclipseLink 一起使用的方法。

  • 我想我将不得不等待 JPA 规范更改或满足我当前要求的 JPA 实现可用。

    关于hibernate - 使用 Spring Data JPA 的连接继承时避免跨表的外部连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16541129/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com