这是具有一对多关系的数据库表结构。 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
}
ModelDetails.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!
任何解决方案
答案 0 :(得分:1)
@ManyToOne(fetch=FetchType.LAZY)
这就是为什么父级为null的原因。您告诉JPA您不想自动获取链接的实体。通常这是一件好事,因为您不想加载一直不需要的额外数据。
如果每次都需要EmpDetails来加载ModelDetails,则可以将其更改为@ManyToOne(fetch=FetchType.EAGER)
。
如果此查询只需要EmpDeatils,则需要修改findByModelNameOrderByCreatedOnDesc来检索关联的实体。
您的查询应类似于SELECT md FROM ModelDetails md JOIN FETCH EmpDetails = WHERE md.name = :name ORDER BY createdOn desc