Jak poprawnie wystawiać leniwych załadowane wielu-wielu dziedzin, dzięki czemu użytkownicy mogą GET
/PATCH
/POST
/DELETE
wiele-wiele relacji podmiot w Spring REST danych?Pobieranie & Aktualizacja leniwych załadowane wiele-wiele pól w Spring Danych REST
Na przykład, biorąc pod uwagę Student
jednostki i Teacher
podmiot związany przez wiele do wielu relacji, z następującymi POJOs:
@Entity
public class Teacher { // owner of bidirectional relationship
@Id
private int id;
private String name;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "teacher_student",
joinColumns = @JoinColumn(name = "teacher_id"),
inverseJoinColumns = @JoinColumn(name = "student_id"))
private Set<Student> students;
// Constructor, getters/setters...
}
@Entity
public class Student {
@Id
private int id;
private String name;
@ManyToMany(mappedBy = "students", fetch = FetchType.LAZY)
private Set<Teacher> teachers;
// Constructor, getters/setters...
}
Podmioty podane są repozytoria:
@RepositoryRestResource(path = "teacher")
public interface TeacherRepository extends CrudRepository<Teacher, int> {}
// similar repository for student
Kiedy wysłać a GET
do localhost: 8080/nauczyciel, otrzymuję:
"_embedded": {
"teacher": [
{
"name": "Bill Billie",
"_links": {
"self": { "href": "http://localhost:8080/teacher/1" },
"teacher": { ... },
"students": { "href": "http://localhost:8080/teacher/1/students" }
}},
(more teachers here...)
]
}
...
ALE, kiedy spróbować GET
do http://localhost:8080/teacher/1/students, otrzymuję 404 Not Found, chociaż nauczyciel „Bill Billie” robi mieć studenta związanego z nim w bazie danych.
Co ciekawe, jeśli zmienię FetchType
do FetchType.EAGER
, wszystko działa w porządku, a ja może wykonać oczekiwany GET
, PATCH
, itd. Co daje? Czy to może być błąd, czy coś spieprzyłem?
tl; dr Wiele-wiele relacji nie jest poprawnie wyeksponowanych z leniwym pobieraniem, ale działa dobrze z entuzjastycznym pobieraniem. Jak mogę leniwego pobierania do pracy z nim?
Edit: Jeśli ma to znaczenie, używam Wiosna 4.2.6 z wiosny Boot 1.3.5 i 2.4.1 OpenJPA jako mojego dostawcy JPA.
Jest to prawdopodobnie dość skomplikowany problem; zwłaszcza, że używasz OpenJPA zamiast powiedzieć, Hibernate, który jest prawdopodobnie lepiej znany.Jeśli podasz przykład działającego projektu, który demonstruje problem, masz większe szanse na rozwiązanie. –
@WillFaithfull that's fair. Mogę dać taki strzał i spróbować mieć działający przykład, ale biorąc pod uwagę ilość zależności i niestandardową konfigurację, byłoby to trudne. Och, radości z niestandardowych potrzeb biznesowych. –
Postaraj się zrobić jak najmniej minimalny przykład. Nie musi przypominać twojego modelu domeny, wystarczy odtworzyć problem. –