2015-10-11 28 views
7

Tôi có hai thực thể, Công ty và Công việc, với mối quan hệ hai chiều OneToMany. Vấn đề của tôi là tôi không thể tải xuống công ty List<Job> jobs của Công ty.Nghỉ ngơi dữ liệu mùa xuân JPA - Không thể tải một cách lười biếng OneToMany mối quan hệ hai chiều

Ví dụ khi tôi làm:

GET /api/companies/1 đây là phản ứng JSON:

{ 
    "id": 1, 
    "name": "foo", 
    ... 
    "_embedded": { 
    "jobs": [ 
     {...}, 
     ... 
     {...} 
    ], 
    "employees": [ 
     {...}, 
     {...} 
    ] 
    }, 
    "_links": { 
    "self": { 
     "href": "http://localhost:8080/api/companies/1" 
    }, 
    "jobs": { 
     "href": "http://localhost:8080/api/companies/1/jobs" 
    }, 
    "employees": { 
     "href": "http://localhost:8080/api/companies/1/employees" 
    } 
    } 
} 

Tôi không muốn có _embedded kể từ khi tôi đã không đặt FetchType = háo hức. Dưới đây là mô hình của tôi:

Company.java

@Entity 
public class Company { 

    @Column(nullable = false, unique = true) 
    private String name; 


    @OneToMany(mappedBy = "company", fetch = FetchType.LAZY) 
    private List<Job> jobs; 

    ... 

    public Company() { 
    } 

    ... 

} 

Job.java

@Entity 
public class Job { 

    @Column(nullable = false) 
    public String title; 

    @Column(length = 10000) 
    public String description; 

    @ManyToOne(fetch=FetchType.LAZY) 
    private Company company; 

    ... 

    public Job() { 
    } 

    ... 

} 

Như bạn có thể nhìn thấy điều tương tự xảy ra đối với các mối quan hệ OneToMany khác (nhân viên). Tôi có thể tránh trả lại toàn bộ danh sách các cơ hội việc làm hoặc nhân viên mỗi lần không?

CHỈNH SỬA: từ phía Công việc, tải chậm hoạt động tốt! Tôi không nhận được phản hồi của công ty liên quan đến công việc. Tôi phải làm rõ ràng /api/jobs/123/company để có được công ty.

EDIT2: Dự đoán chỉ hoạt động đối với bộ sưu tập. Trong trường hợp này nó không phải là những gì tôi cần. Các đoạn trích có thể hoạt động nhưng tôi muốn tránh chúng. Tôi không muốn giải thích làm /api/companies/1?projection=MyProjection vì tôi sẽ không sử dụng nhiều hơn một. Tôi muốn thay đổi hành vi mặc định, giống như các phép chiếu trong bộ sưu tập.

EDIT3: tôi đã cố gắng này

@RestResource(exported = false) 
@OneToMany(mappedBy = "company") 
private List<Job> jobs; 

và tôi nhận được lỗi Detected multiple association links with same relation type! Disambiguate association.

nó thực sự gây phiền nhiễu. Tôi chỉ cần loại bỏ _embedded. Có gì không?

+0

Đây không phải là thực sự là một câu hỏi về JPA, đó là một câu hỏi về việc liệu các bộ sưu tập trong 'Company' nên được đăng. Nó sẽ là cùng một vấn đề nếu mối quan hệ chỉ là POJO không được ánh xạ tới các đối tượng liên tục. – wrschneider

+1

Trong trường hợp này một '@RestResource (xuất khẩu = false) 'hoặc' @ JsonIgnore' mục 'lĩnh vực jobs' nên đủ (xem [ở đây] (http://docs.spring.io/spring-data/rest/docs /current/reference/html/#customizing-sdr.hiding-repositories)). –

+0

@DavidRiccitelli nhưng tôi cần chúng được xuất. Tôi chỉ cần tải lười biếng họ, vì vậy tôi sẽ nhận được công việc của một công ty duy nhất khi tôi làm '/ api/công ty/1/jobs'. –

Trả lời

0

Bạn có thể sử dụng biểu đồ Entity Graph.Entity được sử dụng để ghi đè khi chạy các thiết lập lấy các thuộc tính mappings.For dụ

@Repository 
public interface GroupRepository extends CrudRepository<GroupInfo, String> { 

    @EntityGraph(attributePaths = { "members" }) 
    GroupInfo getByGroupName(String name); 

} 

Từ dữ liệu mùa xuân JPA Tài liệu "4.3.10. Cấu hình Fetch- và LoadGraphs " https://docs.spring.io/spring-data/jpa/docs/current/reference/html/

Ngoài ra; enter image description here

Các vấn đề liên quan