Весна данных JPA OneToOne каскад - PullRequest
0 голосов
/ 29 мая 2018

Я немного смущен эффектом Cascade.ALL.

У меня есть два класса:

class Task {
  @OneToOne(mappedBy = "task", cascade = CascadeType.ALL, orphanRemoval = true)
  private Status status;
}
class Status {
  @OneToOne
  @JoinColumn(name = "task_id", updatable = false)
  private Task task;

  @Column(name="name")
  private String name;
}

Я думал, что сохранение статуса не влияет на класс Task, так как каскадприменяется к классу Task, а не к Status, но он изменяет объект задачи в моей базе данных.Поэтому мне интересно, если

Task task = status.getTask();
task.setName(xxx);
taskDao.save(task); 

имеет тот же эффект, что и

taskDao.save(status.getTask.setName(xxx));

Отличается ли он для statusDao.save(task.getStatus) и statusDao.save(status)?

Спасибо.

1 Ответ

0 голосов
/ 17 декабря 2018

Я думаю, что ваши аннотации сбивают с толку, кто владеет отношениями.С одной стороны, вы указываете @JoinColumn(name = "task_id"), делающий сущность Status владельцем отношения, а с другой стороны, вы указываете @OneToOne(mappedBy = "task"... на объекте Task, делая его владельцем отношения.

Таким образом, статусу принадлежит отношение, и когда вы сохраняете его, он переходит к задаче и обнаруживает, что он также владеет отношением и имеет CascadeType.ALL, поэтому он применяет каскад при сохранении (PERSIST).

Вы, вероятно, должны решить, какой организации следует владеть отношениями, и удалить либо mappedBy, либо @JoinColumn

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...