我正在嘗試使用新JobAdvertise物件串列來持久化一個新JobAdTasks物件。廣告包含與其相關的任務,兩者同時成功持久化。但是,每個的外鍵JobAdTask都是空的。我該如何解決這個問題,在雙向映射關系中同時保留兩個物件?
JobAdvertise班級:
@JsonManagedReference
@OneToMany(cascade = CascadeType.ALL,mappedBy = "jobAdvertise")
private List<JobAdTask> taskList = new ArrayList<>();
public void addTask(JobAdTask adTask) {
if (adTask != null) {
if (taskList == null) { taskList = new ArrayList<>(); }
taskList.add(adTask);
}
}
JobAdTask班級:
@JsonBackReference
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.LAZY)
@JoinColumn(name = "job_add_id")
private JobAdvertise jobAdvertise;
JobAdvertiseService服務等級:
JobAdvertise jobAdvertise = new JobAdvertise();
for (String task : jobAdCreation.getTaskList()) {
JobAdTask jobAdTask = new JobAdTask();
jobAdTask.setTask(task);
jobAdTaskRepo.save(jobAdTask);
//Relationship JobAdvertise and JobAdTask
jobAdvertise.addTask(jobAdTask);
}
jobAdvertiseRepo.save(jobAdvertise);
uj5u.com熱心網友回復:
在您的服務中,您需要更改為以下內容:
for (String task : jobAdCreation.getTaskList()) {
JobAdTask jobAdTask = new JobAdTask();
jobAdTask.setTask(task);
jobAdTask.setJobAdvertise(jobAdvertise);
jobAdTask = jobAdTaskRepo.save(jobAdTask); // Also re-assign the jodAdTask variable since otherwise the id and any timestamps managed by the ORM won't be available in your object.
//Relationship JobAdvertise and JobAdTask
jobAdvertise.addTask(jobAdTask);
}
一種選擇是重寫代碼如下:
// in JobAdvertise
public void addTask(JobAdTask adTask) {
if (adTask != null) {
adTask.setJobAdvertise(this); // Link the objects here
if (taskList == null) { taskList = new ArrayList<>(); }
taskList.add(adTask);
}
}
public void addTasks(Collection<JobAdTask> adTasks) { // add this method to enable passing a collection to the object, removing the need for iteration from the service class.
adTasks.forEach(this::addTask);
}
// in JobAdTask create a constructor taking a string
public JobAdTask(String task) {
this.setTask(task);
}
// in JobAdvertiseService
List<JobAdTask> jobAdTasks = jobAdCreation.getTaskList().stream().map(JobAdTask::new).collect(Collectors.toList()); // creates list of jobAdTasks using the constructor taking a String argument
JobAdvertise jobAdvertise = new JobAdvertise();
jobAdvertise.addTasks(jobAdTasks); // the addTasks uses the addTask method of jobAdvertise, which links the JobAdvertise object and each JobAdTask object.
jobAdvertise = jobAdvertiseRepo.save(jobAdvertise); // when you save the JobAdvertise, since you use CascadeType.ALL, both the advertise and each task object will be persisted to the database.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/473499.html
