Запретить сущностям украсть сопоставленные дочерние сущности друг друга в JPA - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть две сущности, Тема и Урок . Субъект связан с 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, урок "вау"):

{
    "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": []
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...