首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >未加载相关记录的JPA获取外键

未加载相关记录的JPA获取外键
EN

Stack Overflow用户
提问于 2022-04-11 13:48:33
回答 2查看 433关注 0票数 1

我试图对一些报告进行光学化,并试图消除加载一些昂贵的相关记录的需要(在每个~500+记录上加载多个级联负载)。

我的实体是这样的:

代码语言:javascript
运行
复制
@Entity
@Table(name="foo")
public class Foo
{
    @Id
    @Type(type = "pg-uuid")
    private UUID id;
...
    public UUID getId(){
        return id;
    }

以及:

代码语言:javascript
运行
复制
@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?提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-11 15:36:51

尝试将FOO_ID列映射为基本映射,或者除了现有的Foo引用映射之外:

代码语言:javascript
运行
复制
@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为您设置。

票数 3
EN

Stack Overflow用户

发布于 2022-04-11 15:57:50

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

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

代码语言:javascript
运行
复制
@Transient
public UUID getFooId(){
    return foo.getId();
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71828995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档