首页 > 解决方案 > 在不获取实际实体的情况下查询外键字符串 ID

问题描述

鉴于下面的模型,当使用 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;
}

标签: javajpaspring-data-jpaeclipselink

解决方案


如果 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


推荐阅读