java - 在不获取实际实体的情况下查询外键字符串 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;
}
解决方案
如果 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
推荐阅读
- xml - xmlstarlet 通过属性而不是元素匹配/解析
- scikit-learn - TypeError:“OneHotEncoder”对象不可迭代
- python - 如何在 Django 中为几乎相同的 CreateView 视图创建两个并行的 ListView
- reactjs - 如何将邮件保存为pdf格式
- python - 找不到型号“en”。看起来您正在尝试从快捷方式加载模型,该快捷方式在 spaCy v3.0 中已过时
- laravel - 带有 vue3 apollo 和复杂 where 的类型化文档节点
- database - 具有不同客户端(数据库)的 MVC 5 Web 应用程序
- excel - 如何使用 Find 函数查找值?
- amazon-web-services - 为 K8S 上的应用程序安装 NVIDIA 驱动程序
- javascript - Jquery倒计时计数器无法正常工作