java - 如何使用子实体-Spring数据JPA检索父实体
问题描述
这是具有一对多关系的数据库表结构。EMP_DETAILS 和 MODEL_DETAILS 与 action_id 以一对多的关系连接。
下面是为子表和父表创建的实体。
EmpDetails.java
@Table(EMP_DETAILS)
@Entity
public class EmpDetails{
@Id
@Column(name="eid", nullable=false)
private Integer eid;
@OneToMany(cascade=CascadeType.ALL, mappedBy="empDetails"
private Set<ModelDetails> modelDetailsSet;
//other column mappings
}
模型细节.java
@Table(MODEL_DETAILS)
@Entity
public class ModelDetails{
@Id
@Column(name="id)
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="eid",referencedColumnName="eid", nullable=false)
private EmpDetails empDetails;
@Column(name="model_name")
private String modelName;
@Column(name="created_on")
private Date createdOn;
//Other column mappings and getters setters
}
下面的方法确实返回了 Model_Details 记录。
List<ModelDetails> modelDetailList=findByModelNameOrderByCreatedOnDesc("Any_Existng_Name");
但是当我们尝试获取与子记录相关的父记录时,我得到如下所示的 null ......,
modelDetailList.get(0).getEmpDetails();//THIS RETURNS NULL!
对此的任何解决方案
解决方案
@ManyToOne(fetch=FetchType.LAZY)
这就是为什么父母为空。您告诉 JPA 您不想自动获取链接实体。这通常是一件好事,因为您不想加载可能一直不需要的额外数据。
@ManyToOne(fetch=FetchType.EAGER)
如果每次都需要 EmpDetails 来加载 ModelDetails,则可以将其更改为。
如果您只需要此查询的 EmpDeutils,则需要修改 findByModelNameOrderByCreatedOnDesc 以检索关联的实体。
您的查询应该类似于SELECT md FROM ModelDetails md JOIN FETCH EmpDetails = WHERE md.name = :name ORDER BY createdOn desc
推荐阅读
- node.js - Angular Node.js CPanel 部署
- wso2 - 如何根据公共修复的更改应用 WSO2 安全咨询修复
- vue.js - (NUXT) 如何在甜蜜警报 2 中添加组件
- kubernetes - Kubernetes nginx入口控制器不转发带有下划线的标头
- reactjs - 功能组件的 Jest 函数调用在刺激点击时会出错
- jquery - Scrollify - 动画播放时阻止鼠标滚动
- c# - IDisposable 级联
- java - 无法保存到 S3,出现错误“java.io.IOException: No FileSystem for scheme:s3a”
- sockets - Jmeter - 强制关闭套接字/等到收到消息
- python - 完成后请求循环代码?