JPA لا إنقاذ الخارجية مفتاح @OneToMany العلاقة
سؤال
أنا باستخدام الربيع مع السبات كما JPA مزود تحاول الحصول على @OneToMany (الاتصال وجود العديد من مركز مدينة بوخارست نخالة) لحفظ الأجنبية الرئيسية في الهاتف أرقام الجدول.من شكل أحصل على الاتصال كائن أن يكون لديك قائمة من الهاتف(الأرقام) في ذلك.الاتصال على استمر بشكل صحيح (السبات جلب أحد PK من تحديد تسلسل).قائمة الهاتف(أرقام) كما يحصل في نهجهم الصحيح PK, ولكن لا يوجد FK إلى جهات الاتصال الجدول.
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;
}
}
نأمل أن لدي كل ذات الصلة بت أعلاه ، وإلا واسمحوا لي أن أعرف.
المحلول
لديك لإدارة العلاقات جافا نفسك. لهذا النوع من شيء كنت بحاجة إلى شيء مثل:
@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 Phone {
@Id
private Long id;
@ManyToOne
private Contact contact;
...
}
نصائح أخرى
في الرد على الجواب كليتوس. وأود أن أقول أنه من المهم أن يكون هذا الشرح @column
في مجالات الهوية، فضلا عن تسلسل الاشياء. كبديل لاستخدام المعلمة mappedBy من الشرح @OneToMany
هو استخدام الشرح @JoinColumn
.
وكما كيندا جانبا التطبيق الخاص بك من addPhone يحتاج ينظرون. ربما ينبغي أن يكون شيء من هذا القبيل.
public void addPhone(PhoneNumber phone) {
if (phone == null) {
return;
} else {
if (phoneNumbers == null) {
phoneNumbers = new ArrayList<Phone>();
}
phoneNumbers.add(phone);
phone.setContact(this);
}
}
وإذا كانت العلاقة الاتصال الهاتف هو أحادي الاتجاه، يمكنك أيضا استبدال mappedBy
في الشرح @OneToMany
مع @JoinColumn(name = "contact_id")
.
@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;
...
}
أنا لا أعتقد addPhone الطريقة ضروري لديك فقط لضبط الاتصال في الهاتف وجوه:
phone.setContact(contact);