Как получить родительский объект, используя данные дочернего объекта Spring JPA - PullRequest
0 голосов
/ 17 июня 2020

Вот структура таблицы БД с отношением «один ко многим». 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!

Любое решение для этого

1 Ответ

1 голос
/ 17 июня 2020
@ManyToOne(fetch=FetchType.LAZY)

Вот почему родительский элемент равен нулю. Вы сказали JPA, что не хотите автоматически получать связанный объект. Как правило, это хорошо, поскольку вы не хотите загружать дополнительные данные, которые могут не понадобиться все время.

Вы можете изменить это на @ManyToOne(fetch=FetchType.EAGER), если вам будет нужен EmpDetails каждый раз для загрузки ModelDetails. .

Если вам нужны только EmpDeatils для этого запроса, вам необходимо изменить findByModelNameOrderByCreatedOnDes c, чтобы получить связанный объект.

Ваш запрос должен выглядеть примерно так: SELECT md FROM ModelDetails md JOIN FETCH EmpDetails = WHERE md.name = :name ORDER BY createdOn desc

...