2011-12-08 14 views
5

विचार करें कि दो संस्थाएं, विभाग और कर्मचारी हैं, जहां एक विभाग में एन कर्मचारी हैं।जेपीए - @OneToMany अद्यतन

Departament में:

@OneToMany(mappedBy = "department", fetch = FetchType.EAGER) 
private Collection<Employee> employees = new ArrayList<Employee>(); 

कर्मचारी में:

@ManyToOne(fetch = FetchType.EAGER) 
private Department department; 

सब कुछ काम करता है, लेकिन मैं व्युत्क्रम संबंध सेट के बिना विभाग के कर्मचारियों को जोड़ना चाहते हैं। उदाहरण के लिए:

// I will add two employees to a department 
department.getEmployees().add(employee1); 
department.getEmployees().add(employee2); 

// In fact, it is necessary to set the opposite side of the relationship 
employee1.setDepartment(department); 
employee2.setDepartment(department); 

entityManager.merge(department);  
//... 

तो, मेरे सवाल यह है: वहाँ किसी तरह (कुछ एनोटेशन द्वारा जैसे।) है कि जेपीए समझ जाएगा कि यह मैं स्पष्ट है कि बिना संबंध के दूसरी ओर करने के लिए परिवर्तन का प्रचार करना चाहिए? दूसरे शब्दों में, मैं केवल यह करना चाहता हूं:

department.getEmployees().add(employee1); 
department.getEmployees().add(employee2); 
entityManager.merge(department); 

बहुत बहुत धन्यवाद!

उत्तर

2

स्पष्ट उत्तर यह है: नहीं, यह संभव नहीं है कि आपका जेपीए प्रदाता आपके द्वारा वर्णित तरीके से द्विपक्षीय संबंधों को स्वचालित रूप से संभाल सके।

आप फिर भी इन पंक्तियों के साथ कुछ अपने संस्थाओं में द्विदिश संघों की स्थापना, हो सकता है के लिए तर्क को लागू कर सकते हैं:

class Department { 

    public void addEmployee(Employee empl) { 
    if (empl.getDepartment() != null && !this.equals(empl.getDepartment())) { 
     empl.getDepartment().getEmployees().remove(empl); 
    } 
    empl.setDepartment(this); // use the plain setter without logic 
    this.employees.add(empl); 
    } 
} 


class Employee { 
    // additional setter method with logic 
    public void doSetDepartment(Department dept) { 
    if (this.department != null && !this.department.equals(dept)) { 
     this.department.getEmployees().remove(this); 
    } 
    dept.getEmployees().add(this); 
    this.department = dept; 
    } 
} 

इस मामले में आप फिर भी सुनिश्चित करना चाहिए कि संगठनों को पहले से ही प्रारंभ कर रहे हैं जब संस्थाओं के बाहर से नियंत्रित किया जाता आलसी init अपवादों से बचने के लिए दृढ़ता संदर्भ। यह आपको सभी संगठनों के लिए उत्सुक लोडिंग पर स्विच करने के लिए मजबूर कर सकता है, जो आमतौर पर एक अच्छा विकल्प नहीं है। बिडरेक्शनल एसोसिएशन की जटिलता के कारण मैं व्यक्तिगत रूप से संस्थाओं में बिडरेक्शनल एसोसिएशन से बचता हूं और केवल इसका उपयोग करता हूं जब इसके लिए वास्तव में अच्छे कारण हैं।

1

ऐसा करने का एकमात्र तरीका स्पष्ट रूप से जैसा आपने बताया है।

2

जेपीए आपके जावा ऑब्जेक्ट ग्राफ़ को आपके लिए प्रबंधित नहीं करेगा। जैसा कि आप अपने प्रश्न में करते हैं, आप ऑब्जेक्ट ग्राफ़ को स्वयं अपडेट कर सकते हैं, या मुझे लगता है कि आप शायद सहेजने के बाद सभी इकाइयों को फिर से लोड कर सकते हैं।

मैं द्विपक्षीय संबंधों का प्रशंसक नहीं हूं क्योंकि वे गन्दा हो सकते हैं, लेकिन यदि आपको ऐसा करना है तो आप शायद रिश्ते के "स्वामित्व" पक्ष के लिए एक तरफ चुनना चाहेंगे। इस पृष्ठ पर "mappedBy" के बारे में बात करने के लिए यह देखें कि यह कैसे करें http://www.objectdb.com/java/jpa/entity/fields

यदि आपके पास एक सेवा है जिसे आपने कार्यान्वित किया है, तो आप एक सेवा कॉल प्रदान कर सकते हैं जो इस तरह के सामान को प्रबंधित करने का ख्याल रखता है, तो आपके पास अपने कोड में एक स्थान पर इसे भूलने का मौका नहीं होगा और इसे अन्य 15 स्थानों में सही तरीके से कर रहा है।

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