samedi 18 juin 2016

Fetching & Updating lazy-loaded many-many fields in Spring Data Rest

How do I correctly expose lazy-loaded many-many fields so that users can GET/PATCH/POST/DELETE many-many entity relationships?

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?

Aucun commentaire:

Enregistrer un commentaire