Spring Data JPA获取实体外键不会造成依赖实体懒加载

Spring Data JPA get entity foreign key without causing the dependent entity lazy load

我有一个 @Entity A,它使用 OneToOne 关系引用另一个实体 B。我使用 spring 数据 JpaRepository

获取实体 A
A a = aRepository.findById(1);
int b_id = a.getB().getId();

如您所见,我需要查询 B table 的 ID,但是为了做到这一点,我需要调用 B table 的 getter,这将导致延迟加载 B table 本身。我不想这样做,因为我唯一需要的是获取 ID,没有别的,而且该 ID 存在于第一个 A table 中。

有没有什么技巧可以帮助我在不触发新查询的情况下获取受抚养人的 ID table?

更新

@Entity
class A {
    @Id
    private Long id;

    @OneToOne
    private B b;
}

@Entity
class {
    @Id
    private Long id;
}

如果不查看实体映射,我怀疑您的实体 类 可能正在使用 hibernate annotations on the field。有了这个,如果你甚至在实体上调用 a.getB().getId() 中的 getId() 方法,它将导致初始化代理(即 B 对象)并访问数据库以获取它。

因此,如果只想获取实体的 id,则可以放置休眠 annotations on the getter methods。这不会导致将代理(B 对象)初始化为 return id。尽管访问 id 以外的任何 属性 都会导致访问数据库。

HHH-3718

查看相关错误

因此,请尝试使用 property/getter AccessType 而不是字段访问。作为示例,而不是将注释放在字段

@Id
@GeneratedValue(...)
private long id;

将它们放在吸气剂上

@Id
@GeneratedValue(...)
public long getId() { ... }

确保对 B 实体的所有字段进行类似更改。虽然您可以稍后探索 @Access(AccessType.PROPERTY/FIELD)

已经有一个关于此行为的相关bug HHH-3718

Hibernate 论坛上关于字段与 属性 访问类型的相关主题您可能会感兴趣 Field Vs Property access

发布您的实体 类 会有所帮助,如果这不能解决问题。