簡體   English   中英

在不獲取實際實體的情況下查詢外鍵字符串 ID

[英]Query for Foreign Key string ID without fetching the actual entity

給定下面的模型,當使用 JPA 從myentity表中獲取實體時,有沒有辦法防止從anotherentity實體表中獲取實體的二次獲取,但會為我們提供externalPk字符串值(用作外鍵)本身?

雖然我明白,因為在Java中聲明類型不會特別是可能的,我不知道是否有方法來訪問,如果沒有信息的額外獲取考慮它確實正確的,在該myentity表作為一個實際的varchar列.

如果有幫助,我們將使用 EclipseLink 作為我們的 JPA 提供程序。

當前型號

@Entity
@Table(name = "myentity")
@JsonIgnoreProperties(ignoreUnknown = true)
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@IdClass(MyIdClass.class)
public class MyEntity {

    @Id
    @Column(updatable = false)
    private String foo;

    @Id
    @Column(updatable = false)
    private String bar;

    @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "my_foreign_key", referencedColumnName = "external_pk")
    private AnotherEntity anotherEntity;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Embeddable
public class MyIdClass implements Serializable {

    private String foo;
    private String bar;
}
@Entity
@Table(name = "anotherentity")
@JsonIgnoreProperties(ignoreUnknown = true)
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class AnotherEntity {

    @Id
    @Column(name = "external_pk", nullable = false, updatable = false)
    private String externalPk;

    @Column
    private String something;
}

如果 oneToOne 關系不是可選的,您可以使用optional = false, fetch = FetchType.LAZY附加注釋,如下所示:

@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, optional = false, fetch = FetchType.LAZY)
@JoinColumn(name = "my_foreign_key", referencedColumnName = "external_pk")
private AnotherEntity anotherEntity;

然后,您將能夠使用myEntity.getAnotherEntity().getKey()訪問其密鑰,而無需加載關系。 這是一個使用休眠的 POC

如果您希望能夠訪問 my_foreign_key 外鍵值而不必調用 MyEntity.getAnotherEntity().getId() 並執行對 anotherEntity 的完整獲取,您可能應該將其映射為 MyEntity 實例中的只讀基本映射:

public class MyEntity {
...
    @Column(updatable = false)
    private String bar;

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "my_foreign_key", referencedColumnName = "external_pk")
    private AnotherEntity anotherEntity;

    @Column(name = "my_foreign_key",updatable = false, insertable=false)
    private String myForeignKey;
}

作為一個額外的好處,雖然 EclipseLink 在這種類型的映射上做得很好,但它可以用於查詢以防止無意中不必要地強制表連接。 但缺點是您必須自己從關系中設置此值以保持該值與關系值同步 - @MapsId 可能有效,但它適用於 ID 映射中涉及的關系,因此可能不可移植。

暫無
暫無

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

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