How do I correctly expose lazy-loaded many-many fields so that users can GET
/PATCH
/POST
/DELETE
many-many entity relationships in Spring Data REST?
For example, given a Student
entity and Teacher
entity bound by a many to 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...
}
The entities are given repositories:
@RepositoryRestResource(path = "teacher")
public interface TeacherRepository extends CrudRepository<Teacher, int> {}
// similar repository for student
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 a GET
to http://localhost:8080/teacher/1/students, I get a 404 Not Found, even though the teacher "Bill Billie" does have a student associated with him in the database.
Interestingly, if I change the FetchType
to FetchType.EAGER
, everything works fine and I can perform the expected GET
, PATCH
, etc. What gives? Is this a bug, perhaps, or am I screwing something up?
tl;dr Many-many relations are not correctly exposed with lazy fetching, but work fine with eager fetching. How can I get lazy fetching to work with it?
Edit: If it matters, I am using Spring 4.2.6 with Spring Boot 1.3.5, and OpenJPA 2.4.1 as my JPA provider.