如何正確暴露延遲加載多對多的領域很多,很多領域,使用戶可以GET
/PATCH
/POST
/DELETE
多對多實體關係, Spring Data REST?擷取及更新延遲加載在Spring數據REST
例如,給定一個Student
實體,並通過許多勢必一對多的關係,具有以下的POJOs Teacher
實體:
@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...
}
的單位給出的數據存儲:
@RepositoryRestResource(path = "teacher")
public interface TeacherRepository extends CrudRepository<Teacher, int> {}
// similar repository for student
當我送a GET
to localhost:8080/teacher,我得到:
"_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...)
]
}
...
但,當我嘗試GET
到http://localhost:8080/teacher/1/students,我得到一個404未找到,即使老師「比爾比利」 確實有他在數據庫相關聯的學生。
有趣的是,如果我改變FetchType
到FetchType.EAGER
,一切工作正常,我可以執行預期GET
,PATCH
等是怎麼回事?這可能是一個錯誤,或者我搞砸了嗎?
TL;博士多對多的關係不正確地延遲抓取裸露,而是用預先抓取做工精細。我怎樣才能獲得懶惰提取使用它?
編輯:如果它的事項,我使用Spring 4.2.6與Spring 1.3.5引導,和OpenJPA 2.4.1作爲我JPA提供商。
這可能是一個相當複雜的問題;特別是因爲你正在使用的OpenJPA,而不是說,休眠,這可能是更出名。如果您提供了一個演示問題的示例項目,那麼您更有可能獲得解決方案。 –
@ WillFaithfull這是公平的。我可以嘗試一下,嘗試一個有效的例子,儘管考慮到大量的依賴關係和自定義配置,這將是具有挑戰性的。哦,定製業務需求的樂趣。 –
儘量讓最小的例子成爲可能。它不需要類似於您的域模型,只是重現問題。 –