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" 在数据库中确实有一个与他相关的学生.
有趣的是,如果我改变FetchType
到FetchType.EAGER
,一切工作正常,我可以执行预期GET
,PATCH
等等是怎么回事?这可能是一个错误,还是我搞砸了什么?
tl; dr许多关系没有通过延迟提取正确暴露,但在急切提取时工作正常.我怎么能懒得拿起它?
编辑:如果重要,我使用Spring 4.2.6和Spring Boot 1.3.5,OpenJPA 2.4.1作为我的JPA提供者.
嗯,我不确定为什么它不自动获取,更有经验的人可能会问这个问题,但您可以为每个查询指定使用 HQL 的连接获取的手动获取。
select x from X left join fetch x.y y
Run Code Online (Sandbox Code Playgroud)
完成此工作后,您可以使用专门创建的控制器覆盖 get 语句,如下所述:Spring Data REST:覆盖控制器上的存储库方法
我认为唯一值得尝试的其他选择是在 Spring 数据存储库上添加 @Lazy 注释。
归档时间: |
|
查看次数: |
1731 次 |
最近记录: |