How do I set lazy-loaded many, many fields correctly so that users can get many entity relations in Spring Data REST GET / PATCH / POST / DELETE ?
For example, for a Student object and a Teacher object associated with a many-many relationship, with the following 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... }
Repositories are provided to objects:
@RepositoryRestResource(path = "teacher") public interface TeacherRepository extends CrudRepository<Teacher, int> {}
When I send a GET to localhost: 8080 / teacher, I get:
"_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...) ] } ...
BUT , when I try to use GET for http: // localhost: 8080 / teacher / 1 / students , I get 404 Not found , although the Bill Billy teacher has a student associated with him in the database.
Interestingly, if I change FetchType to FetchType.EAGER , everything will be fine, and I will be able to execute the expected GET , PATCH , etc. What gives? Perhaps this is a mistake, or am I screwing something?
tl; dr Many, many relationships do not display correctly with a lazy set, but work great with impatience. How can I get a lazy choice to work with it?
Change If that matters, I am using Spring 4.2.6 with Spring Boot 1.3.5 and OpenJPA 2.4.1 as my JPA provider.