繁体   English   中英

JPA 获取外键不加载相关记录

[英]JPA get foreign key without loading related record

我正在尝试优化一些报告,并试图消除加载一些昂贵的相关记录的需要(多个级联加载,每条约 500 条记录)。

我的实体是这样的:

@Entity
@Table(name="foo")
public class Foo
{
    @Id
    @Type(type = "pg-uuid")
    private UUID id;
...
    public UUID getId(){
        return id;
    }

和:

@Entity
@Table(name="bar")
public class Bar
{
    @Id
    @Type(type = "pg-uuid")
    private UUID id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="FOO_ID")
    private Foo foo;
...

    public UUID getFooId(){
        return foo.getId();
    }

我的问题是当我打这个电话时: return foo.getId(); hibernate 去实例化 Foo 实体,并加载所有相关记录,即使我只想要/需要 id,它是我的 Bar 表中的外键。

有没有办法在不加载 Foo 记录的情况下从 Bar 获取 Foo.Id? 提前致谢。

尝试将 FOO_ID 列映射为基本映射,而不是现有的 Foo 引用映射或作为补充:

@Entity
@Table(name="bar")
public class Bar
{
    @Id
    @Type(type = "pg-uuid")
    private UUID id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="FOO_ID")
    private Foo foo;

    @Column(name="FOO_ID", insertable=false, updatable=false)
    private UUID fooId;
...

    public UUID getFooId(){
        return fooId;
    }

然后您可以决定在查询中使用 fooId 以避免连接。 因为它是只读的,所以 FK 值仍然从 foo 引用设置 - 如果您设置引用而不是 fooId UUID,缓存可能会出现一些问题; 您可以自己设置,也可以强制刷新让 JPA 为您完成。

Hibernate 认为getFooId()是一种可以使用Bar的任何字段的方法。 Hibernate 无法检查该方法到底使用了哪些字段,因此它加载了所有惰性关联以防万一。

您可以使用@Transient来避免这种情况

@Transient
public UUID getFooId(){
    return foo.getId();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM