簡體   English   中英

JPA:如何在不加載相關實體的情況下使用外鍵加載實體

[英]JPA: How do I load an entity with a Foreign Key without loading the related entity

我有兩個實體:

@Entity
public class Account {
    @Id
    private int id;

    // login, name, email, status...
}


@Entity
public class Credential {
    @Id
    private int id;

    @OneToOne
    @MapsId
    private Account account;

    // password, password last set, error count...
}

該設計背后的想法是,業務代碼永遠不應該了解憑據實體,而僅應了解帳戶實體。 此外,我們可能會將憑據存儲在其他位置(數據庫外),因此我不希望Account內有憑據引用。

這種設計的缺點是登錄時首先要檢索和檢查帳戶(未鎖定或禁用)。 只有在那之后,我才檢索憑據。 但是,JPA然后加載第二個Account對象以填充外鍵。

有辦法防止這種情況嗎? 也許是JPA方式給它我已經擁有的帳戶並讓其返回憑據?

我可以用映射到帳戶ID的“ accountId”替換憑據中的外鍵“ account”,但看起來並不理想。

這取決於您的應用程序設計,但是您可以使Credential.account延遲加載FetchType.LAZY ...

@OneToOne(fetch = FetchType.LAZY)
@MapsId
private Account account;

...或者,您也可以merge()帳戶對象merge()到持久會話中,這樣實體管理器就不需要加載關聯了,當然要記住,從那時起它將被管理並且所有更改都將被持久化。 根據您的應用程序,JPA可能會嘗試refresh()它並仍然執行SELECT,但我不確定。 為此編寫一個集成測試!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM