首页 > 解决方案 > 如何使用子实体-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!

对此的任何解决方案

标签: javaspring-bootspring-data-jpa

解决方案


@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


推荐阅读