2015-10-11 9 views
7

मेरे पास दो इकाइयां, कंपनी और जॉब है, जिसमें एक वन्यमी बिडरेक्शनल रिलेशनशिप है। मेरी समस्या यह है कि मैं कंपनी के List<Job> jobs को आलसी लोड नहीं कर सकता।स्प्रिंग डेटा रेस्ट जेपीए - आलसी लोड नहीं कर सकता OneToMany बिडरेक्शनल रिलेशनशिप

उदाहरण के लिए जब मैं कार्य करें:

/api/companies/1 प्राप्त इस 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" 
    } 
    } 
} 

मैं _embedded के बाद से मैं सेट नहीं किया FetchType = उत्सुक है करने के लिए नहीं करना चाहती।

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() { 
    } 

    ... 

} 

आप देख सकते हैं एक ही बात अन्य OneToMany रिश्तों (कर्मचारियों) के लिए होता है: यहाँ मेरी मॉडल हैं। क्या मैं हर बार जॉब ओपनिंग या कर्मचारियों की पूरी सूची लौटने से बच सकता हूं?

संपादित करें: नौकरी की ओर से आलसी भार ठीक काम करता है! मुझे उस नौकरी से संबंधित कंपनी की प्रतिक्रिया में नहीं मिलता है। कंपनी को प्राप्त करने के लिए मुझे स्पष्ट रूप से /api/jobs/123/company करना होगा।

EDIT2: अनुमान केवल संग्रह के लिए काम करते हैं। इस मामले में यह मेरी जरूरत नहीं है। अंश काम कर सकते थे, लेकिन मैं उनसे बचना चाहता हूं। मैं /api/companies/1?projection=MyProjection की व्याख्या नहीं करना चाहता क्योंकि मैं एक से अधिक का उपयोग नहीं करूंगा। मैं डिफ़ॉल्ट व्यवहार को बदलना चाहता हूं, जैसे संकलन संग्रह में करते हैं।

EDIT3: मैं इस

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

की कोशिश की और मैं त्रुटि Detected multiple association links with same relation type! Disambiguate association मिलता है।

यह वास्तव में कष्टप्रद है। मुझे बस _embedded से छुटकारा पाना होगा। कुछ भी?

+0

यह वास्तव में जेपीए के बारे में कोई सवाल नहीं है, यह सवाल है कि 'कंपनी' के भीतर संग्रह को क्रमबद्ध किया जाना चाहिए या नहीं। यह वही समस्या होगी यदि रिश्ते सिर्फ पीओजेओ को लगातार वस्तुओं पर मैप नहीं किया गया था। – wrschneider

+1

इस मामले में 'जॉब्स' फ़ील्ड पर '@RestResource (exported = false)' या '@ JsonIgnore' पर्याप्त होना चाहिए (देखें [यहां] (http://docs.spring.io/spring-data/rest/docs /current/reference/html/#customizing-sdr.hiding-repositories))। –

+0

@ डेविड रिकिकिटेलि लेकिन मुझे उन्हें निर्यात करने की आवश्यकता है। मुझे बस उन्हें आलसी लोड करने की ज़रूरत है, इसलिए जब मैं '/ api/Companies/1/jobs' करता हूं तो मुझे केवल कंपनी की नौकरियां मिलेंगी। –

उत्तर

0

आप उपयोग कर सकते हैं इकाई Graph.Entity रेखांकन विशेषता mappings.For उदाहरण

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

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

} 

की सेटिंग प्राप्त से स्प्रिंग डाटा जेपीए प्रलेखन रनटाइम पर ओवरराइड करने के लिए उपयोग किया जाता है "4.3.10। कॉन्फ़िगर Fetch- और LoadGraphs " https://docs.spring.io/spring-data/jpa/docs/current/reference/html/

इसके अतिरिक्त; enter image description here

संबंधित मुद्दे