2009-05-02 16 views
14

पर विदेशी कुंजी को सहेज नहीं रहा है, मैं एक जेपीए प्रदाता के रूप में स्प्रिंग विद हाइबरनेट का उपयोग कर रहा हूं और फ़ोन नंबर तालिका में विदेशी कुंजी को सहेजने के लिए @OneToMany (कई फोननबर्स वाले संपर्क) प्राप्त करने का प्रयास कर रहा हूं। मेरे फॉर्म से मुझे एक संपर्क ऑब्जेक्ट मिलता है जिसमें इसमें फ़ोन (नंबर) की एक सूची होती है। संपर्क ठीक से जारी रहता है (हाइबरनेट निर्दिष्ट अनुक्रम से पीके प्राप्त करता है)। फोन (संख्याओं) की सूची भी सही पीके के साथ बनी रहती है, लेकिन संपर्क तालिका में कोई एफके नहीं है।जेपीए @OneToMany संबंध

public class Contact implements Serializable { 
@OneToMany(mappedBy = "contactId", cascade = CascadeType.ALL, fetch=FetchType.EAGER) 
private List<Phone> phoneList; 
} 

public class Phone implements Serializable { 
@JoinColumn(name = "contact_id", referencedColumnName = "contact_id") 
@ManyToOne 
private Contact contactId; 
} 

@Repository("contactDao") 
@Transactional(readOnly = true) 
public class ContactDaoImpl implements ContactDao { 
    @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) 
    public void save(Contact c) { 
    em.persist(c); 
    em.flush(); 
    } 
} 


@Controller 
public class ContactController { 
    @RequestMapping(value = "/contact/new", method = RequestMethod.POST) 
    public ModelAndView newContact(Contact c) { 
    ModelAndView mv = new ModelAndView("contactForm"); 
    contactDao.save(c); 
    mv.addObject("contact", c); 
    return mv; 
    } 
} 

उम्मीद है कि मुझे उपर्युक्त सभी संबंधित बिट्स मिल गए हैं, अन्यथा कृपया मुझे बताएं।

उत्तर

21

आपको जावा संबंधों को स्वयं प्रबंधित करना होगा। इस तरह की चीज़ के लिए आपको कुछ चाहिए:

@Entity 
public class Contact { 
    @Id 
    private Long id; 

    @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "contact") 
    private List<Phone> phoneNumbers; 

    public void addPhone(PhoneNumber phone) { 
    if (phone != null) { 
     if (phoneNumbers == null) { 
      phoneNumbers = new ArrayList<Phone>();   
     } 
     phoneNumbers.add(phone); 
     phone.setContact(this); 
    } 
    } 

    ... 
} 

@Entity 
public class PhoneNumber { 
    @Id 
    private Long id; 

    @ManyToOne 
    private Contact contact; 

    ... 
} 
+0

धन्यवाद इसी प्रकार, जावा संबंधों की स्थापना इसे हल। –

+5

क्या 'ऐडफोन' विधि सही है? ऐसा लगता है कि शून्य की जांच गलत जगह पर है। –

+0

फोन.सेट संपर्क (यह) - यह कॉलम एक स्मृति रिसाव हो? या नहीं? –

6

कैलेटस के उत्तर के जवाब में। मैं कहूंगा कि आईडी फ़ील्ड के साथ-साथ सभी अनुक्रम सामग्री पर @column एनोटेशन होना महत्वपूर्ण है। @OneToMany एनोटेशन के मैप्डबी पैरामीटर का उपयोग करने का विकल्प @JoinColumn एनोटेशन का उपयोग करना है।

एक तरह से ऐडफोन की आवश्यकता के कार्यान्वयन की आवश्यकता है। यह शायद कुछ ऐसा होना चाहिए।

public void addPhone(PhoneNumber phone) { 
    if (phone == null) { 
     return; 
    } else { 
     if (phoneNumbers == null) { 
      phoneNumbers = new ArrayList<Phone>(); 
     } 
     phoneNumbers.add(phone); 
     phone.setContact(this); 
    } 
} 
1

मुझे नहीं लगता कि addPhone विधि के लिए आवश्यक है, आप केवल फोन वस्तु में संपर्क स्थापित करने के लिए: phone.setContact (संपर्क);

-1

यदि संपर्क-फोन संबंध यूनिडायरेक्शनल है, तो आप एनोटेशन @JoinColumn(name = "contact_id") के साथ mappedBy को भी प्रतिस्थापित कर सकते हैं।

@Entity 
public class Contact { 
    @Id 
    private Long id; 

    @OneToMany(cascade = CascadeType.PERSIST) 
    @JoinColumn(name = "contact_id") 
    private List<Phone> phoneNumbers; 

    // normal getter/setter 
    ... 
} 

@Entity 
public class PhoneNumber { 
    @Id 
    private Long id; 

    ... 
} 

में JPA @OneToMany -> Parent - Child Reference (Foreign Key)

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