Hibernate/JPA: Как правильно моделировать однонаправленные отношения @ManyToMany для операций CRUD?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Hibernate/JPA: Как правильно моделировать однонаправленные отношения @ManyToMany для операций CRUD?

Сообщение Anonymous »

Я реализовал следующие объекты:
Учитель:
@Getter
@Setter
@ToString
@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false, updatable = false)
private Long id;
private String name;
@ManyToMany(cascade = CascadeType.MERGE)
@JoinTable(
name = "teacher_timeslot",
joinColumns = @JoinColumn(name = "teacher_id"),
inverseJoinColumns = @JoinColumn(name = "timeslot_id")
)
@ToString.Exclude
private Set timeslots = new HashSet(); //teacher preffered Timeslots

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
Teacher teacher = (Teacher) o;
return id != null && Objects.equals(id, teacher.id);
}

@Override
public int hashCode() {
return getClass().hashCode();
}
}

Временной интервал:
//ignore the JsonIdentity as I need it to another class (Timetable to be more specific)
@JsonIdentityInfo(scope = Timeslot.class, generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@Getter
@Setter
@ToString
//@RequiredArgsConstructor
@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Timeslot{

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false, updatable = false)
@PlanningId
private Long id;
private DayOfWeek dayOfWeek;
private LocalTime startTime;
private LocalTime endTime;

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
Timeslot timeslot = (Timeslot) o;
return id != null && Objects.equals(id, timeslot.id);
}

@Override
public int hashCode() {
return getClass().hashCode();
}
}

И это следующая полезная нагрузка JSON, которую я использую для сохранения/получения учителя или временного интервала:
Сохранить временной интервал:{"id":3,"dayOfWeek":"MONDAY","startTime":"14:00:00","endTime":"16:00:00"}

Получить временные интервалы:
[
{
"id": 1,
"dayOfWeek": "MONDAY",
"startTime": "10:00:00",
"endTime": "12:00:00"
},
{
"id": 2,
"dayOfWeek": "MONDAY",
"startTime": "12:00:00",
"endTime": "14:00:00"
},
{
"id": 3,
"dayOfWeek": "MONDAY",
"startTime": "14:00:00",
"endTime": "16:00:00"
}
]

Сохранить/получить учителя:
([){
"id": 1,
"name": "Ben",
"timeslots": [
{
"id": 1,
"dayOfWeek": "MONDAY",
"startTime": "10:00:00",
"endTime": "12:00:00"
},
{
"id": 2,
"dayOfWeek": "MONDAY",
"startTime": "12:00:00",
"endTime": "14:00:00"
}
]
}(])

Если я хочу добавить еще одного учителя:
{
"id": 2,
"name": "Alex",
"timeslots": [
{
"id": 2,
"dayOfWeek": "MONDAY",
"startTime": "12:00:00",
"endTime": "14:00:00"
},
{
"id": 3,
"dayOfWeek": "MONDAY",
"startTime": "14:00:00",
"endTime": "16:00:00"
}
]
}

И я выполняю запрос getAllTeachers() и получаю следующее:
[
{
"id": 1,
"name": "Ben",
"timeslots": [
{
"id": 1,
"dayOfWeek": "MONDAY",
"startTime": "10:00:00",
"endTime": "12:00:00"
},
{
"id": 2,
"dayOfWeek": "MONDAY",
"startTime": "12:00:00",
"endTime": "14:00:00"
}
]
},
{
"id": 2,
"name": "Alex",
"timeslots": [
2, // the problem
{
"id": 3,
"dayOfWeek": "MONDAY",
"startTime": "14:00:00",
"endTime": "16:00:00"
}
]
}
]

вместо:
[
{
"id": 1,
"name": "Ben",
"timeslots": [
{
"id": 1,
"dayOfWeek": "MONDAY",
"startTime": "10:00:00",
"endTime": "12:00:00"
},
{
"id": 2,
"dayOfWeek": "MONDAY",
"startTime": "12:00:00",
"endTime": "14:00:00"
}
]
},
{
"id": 2,
"name": "Alex",
"timeslots": [
{
"id": 2,
"dayOfWeek": "MONDAY",
"startTime": "12:00:00",
"endTime": "14:00:00"
},
{
"id": 3,
"dayOfWeek": "MONDAY",
"startTime": "14:00:00",
"endTime": "16:00:00"
}
]
}
]

Как решить эту проблему? Чего мне здесь не хватает?
По сути, я хочу воспроизвести следующую последовательность кода, обеспечив при этом функциональность CRUD:
Timeslot wednesday12to14 = new Timeslot(nextTimeslotId++, DayOfWeek.WEDNESDAY, LocalTime.of(12, 0), LocalTime.of(14, 0));
Teacher ben = new Teacher(nextTeacherId++, "Ben", List.of(tuesday12to14, tuesday14to16,
tuesday16to18, tuesday18to20, tuesday20to22, wednesday12to14, wednesday14to16, wednesday18to20, wednesday20to22));

Любая помощь будет оценена по достоинству! Не стесняйтесь редактировать, если я неправильно сформулировал вопрос.

ОБНОВЛЕНИЕ

Я пытался сделать следующее:
  • Удален каскад и добавлен FetchType.Eager из аннотации @ManyToMany.
  • Удален каскад и тип выборки из аннотации @ManyToMany.
  • Я также пытался добавить аннотацию jakarta @Transactional в Сервис для методов создания и чтения.
Ни один из них не работает.

Ни один из них не работает.

Ни один из них не работает.

p>
Это моя реализация службы учителя:
@Service
@RequiredArgsConstructor
@Slf4j
public class TeacherService {

private final TeacherRepo teacherRepo;

public List getAllTeachers() {
return teacherRepo.findAllByOrderByIdAsc();
}

public Teacher createTeacher(Teacher teacher) {
return teacherRepo.save(teacher);
}

//update and delete methods

}


Подробнее здесь: https://stackoverflow.com/questions/784 ... onship-for
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»