Làm thế nào để đúng lộ lười biếng-nạp nhiều-nhiều lĩnh vực để người dùng có thể GET
/PATCH
/POST
/DELETE
nhiều-nhiều mối quan hệ thực thể trong Spring Data REST?tìm nạp & cập nhật nhiều nhiều lĩnh vực lười biếng-nạp trong mùa xuân dữ liệu REST của
Ví dụ, cho một Student
thực thể và Teacher
thực thể bị ràng buộc bởi một nhiều mối quan hệ, với các POJO sau: kho
@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...
}
Đối tượng được đưa ra:
@RepositoryRestResource(path = "teacher")
public interface TeacherRepository extends CrudRepository<Teacher, int> {}
// similar repository for student
Khi tôi gửi a GET
tới localhost: 8080/teacher, tôi nhận được:
"_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...)
]
}
...
NHƯNG, khi tôi thử một GET
-http://localhost:8080/teacher/1/students, tôi nhận được một 404 Not Found, mặc dù giáo viên "Bill Billie" không có một sinh viên liên quan đến ông trong cơ sở dữ liệu.
Điều thú vị là, nếu tôi thay đổi FetchType
-FetchType.EAGER
, mọi thứ đều hoạt động tốt và tôi thể thực hiện dự kiến GET
, PATCH
, vv gì cho? Đây có phải là một lỗi, có lẽ, hay tôi đang vặn vẹo thứ gì đó?
tl; dr Quan hệ nhiều-nhiều không được hiển thị chính xác khi tìm nạp chậm, nhưng hoạt động tốt với việc tìm nạp mong muốn. Làm thế nào tôi có thể nhận được lười biếng lấy làm việc với nó?
Chỉnh sửa: Nếu có vấn đề, tôi đang sử dụng Spring 4.2.6 với Spring Boot 1.3.5 và OpenJPA 2.4.1 làm nhà cung cấp JPA của tôi.
Đây có thể là vấn đề khá phức tạp; đặc biệt là kể từ khi bạn đang sử dụng OpenJPA thay vì nói, Hibernate, mà có lẽ là tốt hơn được biết đến.Nếu bạn cung cấp một dự án ví dụ làm việc thể hiện vấn đề, bạn có nhiều khả năng nhận được giải pháp hơn. –
@WillFaithfull thật công bằng. Tôi có thể cho rằng một shot và cố gắng để có một ví dụ làm việc, mặc dù cho số lượng phụ thuộc và cấu hình tùy chỉnh, đó sẽ là thử thách. Oh, niềm vui của nhu cầu kinh doanh tùy chỉnh. –
Cố gắng làm cho ví dụ tối thiểu nhất có thể. Nó không cần phải giống với mô hình miền của bạn, chỉ cần tái tạo vấn đề. –