JPA没有将外键保存到@OneToMany关系

我正在使用Spring with Hibernate作为JPA提供程序,并且正在尝试获取@OneToMany(具有许多phonenumbers的联系人)以将外键保存在电话号码表中。 从我的表单中我得到一个Contact对象,其中包含Phone(数字)列表。 Contact得到了正确的持久化(Hibernate从指定的序列中获取PK)。 电话号码(号码)也会以正确的PK保留,但联系人表格中没有FK。

public class Contact implements Serializable { @OneToMany(mappedBy = "contactId", cascade = CascadeType.ALL, fetch=FetchType.EAGER) private List 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; } } 

希望我得到上面的所有相关内容,否则请告诉我。

您必须自己管理Java关系。 对于这种事情你需要这样的东西:

 @Entity public class Contact { @Id private Long id; @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "contact") private List phoneNumbers; public void addPhone(PhoneNumber phone) { if (phone != null) { if (phoneNumbers == null) { phoneNumbers = new ArrayList(); } phoneNumbers.add(phone); phone.setContact(this); } } ... } @Entity public class PhoneNumber { @Id private Long id; @ManyToOne private Contact contact; ... } 

回答Cletus的回答。 我会说在id字段上有@column注释以及所有序列的东西是很重要的。 使用@OneToMany批注的mappedBy参数的另一种方法是使用@JoinColumn批注。

有点像你需要看一下addPhone的实现。 应该是这样的。

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

如果Contact-Phone关系是单向的,您还可以使用mappedBy @JoinColumn(name = "contact_id")替换@OneToMany批注中的mappedBy

 @Entity public class Contact { @Id private Long id; @OneToMany(cascade = CascadeType.PERSIST) @JoinColumn(name = "contact_id") private List phoneNumbers; // normal getter/setter ... } @Entity public class PhoneNumber { @Id private Long id; ... } 

类似于JPA @OneToMany – > Parent – Child Reference(外键)

我不认为addPhone方法是必要的,你只需要在phone对象中设置联系人:

 phone.setContact(contact);