Предотвращение кражи объектами отображенных дочерних объектов друг друга в JPA

#java #hibernate #spring-boot #jpa #persistence

#java #переход в спящий режим #весенняя загрузка #jpa #сохранение

Вопрос:

У меня есть две сущности, Subject и Lesson. Тема имеет отношение OneToMany к уроку.

В моей базе данных уже есть 2 набора объектов:

 {
    "id": 1,
    "name": "wow",
    "lessons": [
        {
            "id": 2,
            "difficulty": "hard"
        }
    ]
}
  

и

 {
    "id": 3,
    "name": "wow2",
    "lessons": [
        {
            "id": 4,
            "difficulty": "hardy"
        }
    ]
}
  

Объекты определяются следующим образом

 @Entity
public class Lesson {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    private String difficulty;

    @ManyToOne(targetEntity = Subject.class)
    private Subject subject;
}

@Entity
public class Subject {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    private String name;

    @OneToMany(orphanRemoval=false, cascade= CascadeType.ALL)
    @JoinColumn(name = "subject_id")
    private List<Lesson> lessons;
}
  

Я хочу предотвратить успешное сохранение этого объекта, поскольку он крадет урок (1, «wow»):

 {
    "id": 3,
    "name": "wow2",
    "lessons": [
        {
            "id": 2,
            "difficulty": "hard_overrriden"
        }
    ]
}
  

Повторение всех уроков вручную — очевидный способ, но я хочу простое решение.

РЕДАКТИРОВАТЬ: Мое решение устраняет проблему с кражей, но также создает другую

 @ManyToOne
@JoinColumn(updatable = false)
private Subject subject;
.
.
.
@OneToMany(cascade= CascadeType.ALL, mappedBy="subject", orphanRemoval=true)
private List<Lesson> lessons;
  

Это устраняет проблему с кражей, но удаляет сироту, если я хочу отделить урок от предмета.

При удалении orphanRemoval = true это просто прекращает отделять урок от предмета.

Объект разъединения выглядит следующим образом:

 {
    "id": 1,
    "name": "wow",
    "lessons": []
}
  

Комментарии:

1. Я был бы признателен, если кто-нибудь сможет предложить лучшее название.

2. Ваше отображение неверно. Вот как отображается двунаправленный OneToMany: docs.jboss.org/hibernate/orm/current/userguide/html_single /…

3. Но в любом случае, при привязке существующего урока к теме убедитесь, что в нем нет никакой другой темы. Все, что вам нужно, это if блок.

4. ДА. Но это неверно. Вы должны использовать mappedBy. Как описано в документации.

5. Нормально ли это отображение @JBNizet