繁体   English   中英

如何同时持久化两个相互关联的对象?

[英]How persist two objects related to each other at the same time?

我正在尝试使用新的JobAdTasks对象列表来保留新的JobAdvertise object。 广告包含与其相关的任务,两者同时成功持久化。 但是,每个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服务class:

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);

在您的服务中,您需要更改为以下内容:

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.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM