#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