2016-06-17 23 views
6

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.

+0

Đâ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. –

+0

@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. –

+0

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 đề. –

Trả lời

1

Hmm Tôi không chắc chắn lý do tại sao nó không tự động tìm nạp ai đó có kinh nghiệm hơn sẽ phải hỏi điều đó, nhưng bạn có thể chỉ định tìm nạp thủ công với tìm nạp tham gia HQL cho mỗi truy vấn.

select x from X left join fetch x.y y 

Sau khi nhận được này làm việc bạn có thể ghi đè lên tuyên bố get của bạn với một bộ điều khiển đặc biệt tạo ra như mô tả ở đây: Spring Data REST: Override repository method on the controller

Chỉ tùy chọn khác mà tôi nghĩ có thể là giá trị cố gắng được thêm một chú thích @Lazy trên Spring- của bạn kho dữ liệu.

+1

Vâng, tôi khá chắc chắn rằng tôi có thể làm cho nó hoạt động nếu tôi tự viết tất cả các truy vấn và ghi đè các phương thức 'find', nhưng điều đó chủ yếu sẽ đánh bại điểm sử dụng Spring JPA và Data REST ngay từ đầu. Tôi muốn giữ nó như một phương sách cuối cùng. Oh và chú thích '@ Lazy' không hoạt động, thật không may. –

+0

Tôi đã trao tiền thưởng cho bạn để nhận được phản hồi hữu ích, mặc dù nó không giải quyết được vấn đề tôi đang gặp phải. Vẫn đang tìm thêm câu trả lời. –

+0

Cảm ơn, Khi tôi có cơ hội, tôi sẽ thử và thiết lập một dự án thử nghiệm và xem liệu tôi có thể chạy một số gỡ lỗi hay không. –

1

Hãy thử tạo giao dịch RestResources của bạn.

Chú thích với @Transactional

+0

Không, không hoạt động. –

+0

Bạn có thể vui lòng dán bean TransactionManager của mình tại đây không. Chỉ cần khai báo bean từ ngữ cảnh xml –

0

Thêm phụ thuộc sau

<dependency> 
    <groupId>com.fasterxml.jackson.datatype</groupId> 
    <artifactId>jackson-datatype-hibernate4</artifactId> 
</dependency> 

Thêm lớp cấu hình.

@Configuration 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter{ 


    public MappingJackson2HttpMessageConverter jacksonMessageConverter(){ 
     MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter(); 

     ObjectMapper mapper = new ObjectMapper(); 
     //Registering Hibernate4Module to support lazy objects 
     mapper.registerModule(new Hibernate4Module()); 

     messageConverter.setObjectMapper(mapper); 
     return messageConverter; 

    } 

    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
     //Here we add our custom-configured HttpMessageConverter 
     converters.add(jacksonMessageConverter()); 
     super.configureMessageConverters(converters); 
    } 
} 
Các vấn đề liên quan