2009-11-25 10 views
43

शायद यह एक बेवकूफ सवाल है लेकिन यह मुझे परेशान कर रहा है।जेपीए - कई रिश्तों में से एक को कायम रखना

मैं वाहन के लिए कर्मचारी के कई रिश्ते के लिए एक दो-तरफा एक है। जब मैं पहली बार डेटाबेस में एक कर्मचारी को जारी रखता हूं (यानी इसमें कोई असाइन आईडी नहीं है) मैं भी अपने संबंधित वाहनों को जारी रखना चाहता हूं।

यह इस समय मेरे लिए ठीक काम करता है, सिवाय इसके कि मेरी सहेजी गई वाहन इकाई स्वचालित कर्मचारी को स्वचालित रूप से मैप नहीं कर रही है, और डेटाबेस में कर्मचारी तालिका में कर्मचारी_आईडी विदेशी कुंजी कॉलम शून्य है।

मेरे सवाल है, यह एक ही समय में कायम कर्मचारी ही कायम की जा रही है वाहन के कर्मचारी के लिए संभव है? मुझे एहसास है कि कर्मचारी को पहले सहेजा जाना होगा, फिर वाहन को बाद में बचाया जाएगा। क्या जेपीए मेरे लिए यह स्वचालित रूप से कर सकता है? या मुझे निम्नलिखित की तरह कुछ करना है:

Vehicle vehicle1 = new Vehicle(); 
Set<Vehicle> vehicles = new HashSet<Vehicle>(); 
vehicles.add(vehicle1); 

Employee newEmployee = new Employee("matt"); 
newEmployee.setVehicles(vehicles); 
Employee savedEmployee = employeeDao.persistOrMerge(newEmployee); 

vehicle1.setAssociatedEmployee(savedEmployee); 
vehicleDao.persistOrMerge(vehicle1); 

धन्यवाद!

संपादित करें: के रूप में अनुरोध किया है, यहाँ है मेरी मैपिंग

@Entity 
public class Employee { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name="employee_id") 
    private Long id; 

    @OneToMany(mappedBy="associatedEmployee", cascade=CascadeType.ALL) 
    private Set<Vehicle> vehicles; 

    ... 

} 

@Entity 
public class Vehicle { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name="vehicle_id") 
    private Long id; 

    @ManyToOne 
    @JoinColumn(name="employee_id") 
    private Employee associatedEmployee; 

    ... 
} 

मैं सिर्फ महसूस किया कि मैं निम्न विधि मेरी कर्मचारी वर्ग पर परिभाषित किया गया है चाहिए (सभी अन्य तरीकों आदि के बिना):

public void addVehicle(Vehicle vehicle) { 
    vehicle.setAssociatedEmployee(this); 
    vehicles.add(vehicle); 
} 

अब उपरोक्त कोड इस तरह दिखेगा:

Vehicle vehicle1 = new Vehicle(); 

Employee newEmployee = new Employee("matt"); 
newEmployee.addVehicle(vehicle1); 
Employee savedEmployee = employeeDao.persistOrMerge(newEmployee); 

बहुत सरल और क्लीनर। हर किसी को आपकी सहायताके लिए शुक्रिया!

उत्तर

30

आप कर्मचारी बने पहले वाहन पर associatedEmployee सेट करना होगा।

Employee newEmployee = new Employee("matt"); 
vehicle1.setAssociatedEmployee(newEmployee); 
vehicles.add(vehicle1); 

newEmployee.setVehicles(vehicles); 

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee); 
+2

ओह, ठीक है। यह काम करता है। लेकिन मैंने सोचा कि ऐसा कोई तरीका हो सकता है जहां मुझे वाहन पर संबंधित कर्मचारी को स्पष्टीकरण की आवश्यकता नहीं है? – JMM

+0

मुझे नहीं लगता कि जेपीए के साथ यह संभव है। मैंने हाइबरनेट का भी उपयोग किया है और अगर मुझे सही याद है तो यह संभव है। – Bobby

+0

मेरे मूल कोड में समस्या को इंगित करने के लिए धन्यवाद, मैंने इसे अपडेट किया है कि मैं इसे कैसे हल करने जा रहा हूं। – JMM

15

एक तरीका यह है कि ऐसा करने के लिए आप पर झरना विकल्प सेट करने के लिए है रिश्ते की "एक" पक्ष:

class Employee { 
    // 

    @OneToMany(cascade = {CascadeType.PERSIST}) 
    private Set<Vehicles> vehicles = new HashSet<Vehicles>(); 

    // 
} 

इस से, जब आप कॉल

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee); 

यह भी वाहनों की बचत होगी ।

+0

हाय, उत्तर के लिए धन्यवाद। मेरे पास कैस्केड सेट है जहां आपने सुझाव दिया है और वाहनों को बचाया जाता है। मेरी समस्या यह है कि जब वाहनों को बचाया जाता है, तो मैं चाहता हूं कि उनके विदेशी कुंजी कॉलम कर्मचारी_आईडी को उस कर्मचारी की आईडी शामिल करें जिसे मैंने अभी बचाया है। – JMM

+1

विदेशी कुंजी को कैस्केड में सहेजा जाना चाहिए ... क्या आप @OneToMany और @ManyToOne एनोटेशन भेज सकते हैं जिनका उपयोग आप जांच के लिए कर रहे हैं? बेस्ट सादर Denes – user218435

+0

मैं एनोटेशन शामिल करने के लिए अपने मूल पोस्ट नवीनीकृत किया है। – JMM

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