如何同时存在两个对象?

发布于 2025-01-27 10:13:34 字数 1223 浏览 1 评论 0原文

我试图坚持一个新的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);

I am trying to persist a new JobAdvertise object with a list of new JobAdTasks objects. An advertise contains tasks related to it, both persisted successfully at the same time. However, the foreign key for each JobAdTask is empty. How can I solve this problem, persisting two objects at the same in a two-way mapping relationship?

JobAdvertise class:

@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 class:

@JsonBackReference
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.LAZY)
@JoinColumn(name = "job_add_id")
private JobAdvertise jobAdvertise;

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

感悟人生的甜 2025-02-03 10:13:34

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

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.

In your service, you need to change to the following:

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

An option would be to re-write the code as following:

// 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文