簡體   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