Учитель:
@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