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

JPA在不加载相关记录的情况下获取外键

金烨华
2023-03-14

我试图验光一些报告,并试图删除需要加载一些昂贵的相关记录(多个级联加载,每个约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();
    }

我的问题是,当我做这个调用:返回foo.getId();Hibernate去实例化Foo实体,并加载所有相关的记录,即使我只想要/需要id,这是我的Bar表中的外键。

有没有办法得到福。在没有加载Foo记录的情况下从酒吧获得Id?提前谢谢。

共有2个答案

龙哲
2023-03-14

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

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

@Transient
public UUID getFooId(){
    return foo.getId();
}
商俊智
2023-03-14

尝试将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;
    }

然后,您可以决定在查询中使用foId来避免连接。因为它是只读的,所以FK值仍然是从foo引用中设置的——如果您设置的是引用而不是foIdUUID,缓存可能会有一些问题;您可以自己设置它,或者强制刷新让JPA为你做这件事。

 类似资料:
  • 问题内容: 我有两个实体: 保存首选项时,我具有accountId,但没有Account实体。在这种情况下,如何保存首选项? 加载帐户实体并在首选项上进行设置?对我来说,这似乎是对数据库的错误旅行。 是否具有一个可持久保存的accountId字段并使Account字段为只读?同时拥有一个accountId字段和一个Account字段似乎多余吗? 使用NamedQuery保留首选项?我希望只是通用地

  • 我在我的应用程序中使用CloudKit作为远程保存数据的一种方式。我的一个记录具有保存图像的CKAsset属性。当我获取记录时,我意识到完成查询要花很多时间。经过多次测试,我得出结论,当您查询记录时,CloutKit会用record对象下载整个资产文件。因此,当您从record对象获取资产并请求它的fileURL时,它会给您一个本地文件路径URL,而不是HTTP类型的URL。这对我来说是一个问题,

  • 我有一个实体,它与其他实体有关系,比如下面的实体。实际上,实体有许多领域。 对于一些搜索,我只对的Basic属性感兴趣,而不想检索任何关系。一个选项是使用

  • 问题内容: 但是,首选解决方案(属性访问)在我的情况下不起作用(我缺少列异常-为什么?) 该模型如下所示:实体和。表含有列是的表,以便它是典型的关系。 现在的问题是,如果我取的实体,我需要有机会获得价值(亦称的实体),而不取实体。我怎样才能做到这一点? 我使用的映射如下所示: 我想做的是调用而无需从DB中额外获取实体。 根据我上面提到的答案,如果我将注释从字段移到getter(在实体上,我对吗?)

  • 据我所知,您可以通过以下方式使用PIL获取图像大小 但是,我希望获得图像的宽度和高度,而不必将图像加载到内存中。可能吗?我只做图像大小的统计,不关心图像内容。我只是想让我的处理速度更快。

  • 首先,如果这是一个很长的代码段,我很抱歉,但是,我想做一个模态窗口,它将你在我的用户表单中写的东西写下来,并要求你确认它。我目前正在学习Javascript,我不允许使用innerHTML,我必须动态地编写“名字”等(名字的文本),不允许只在弹出窗口内写它。我已经让大多数东西工作,但“名字”“名字”等显示为“未定义”,或者(正如你可以看到的,我在这种情况下只用名字尝试的事情)显示为“空”。 希望有