在Spring Data REST中获取和更新延迟加载的多个字段

JW *_*Lim 6 java spring openjpa spring-data-jpa spring-data-rest

如何正确公开延迟加载的多个字段,以便用户在Spring Data REST中可以GET/ PATCH/ POST/ DELETE多个实体关系?

例如,给定一个由多对多关系绑定的Student实体和Teacher实体,使用以下POJO:

@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...
}
Run Code Online (Sandbox Code Playgroud)

实体被赋予存储库:

@RepositoryRestResource(path = "teacher")
public interface TeacherRepository extends CrudRepository<Teacher, int> {}

// similar repository for student
Run Code Online (Sandbox Code Playgroud)

当我发送GET到localhost:8080 /老师时,我得到:

"_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...)
    ]
}
...
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试GET访问http:// localhost:8080/teacher/1/students时,我得到404 Not Found,即使老师"Bill Billie" 在数据库中确实有一个与他相关的学生.

有趣的是,如果我改变FetchTypeFetchType.EAGER,一切工作正常,我可以执行预期GET,PATCH等等是怎么回事?这可能是一个错误,还是我搞砸了什么?

tl; dr许多关系没有通过延迟提取正确暴露,但在急切提取时工作正常.我怎么能懒得拿起它?

编辑:如果重要,我使用Spring 4.2.6和Spring Boot 1.3.5,OpenJPA 2.4.1作为我的JPA提供者.

Mat*_*ana 1

嗯,我不确定为什么它不自动获取,更有经验的人可能会问这个问题,但您可以为每个查询指定使用 HQL 的连接获取的手动获取。

select x from X left join fetch x.y y
Run Code Online (Sandbox Code Playgroud)

完成此工作后,您可以使用专门创建的控制器覆盖 get 语句,如下所述:Spring Data REST:覆盖控制器上的存储库方法

我认为唯一值得尝试的其他选择是在 Spring 数据存储库上添加 @Lazy 注释。