题
我正在使用Spring和Hibernate作为JPA提供商,并试图让@OneToMany(一个拥有许多语音的联系人)将外键保存在电话号码表中。从我的表单中我得到一个Contact对象,其中包含Phone(数字)列表。 Contact正确持久化(Hibernate从指定的序列中获取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;
}
}
希望我得到上面的所有相关内容,否则请告诉我。
解决方案
您必须自己管理Java关系。对于这种事情你需要像:
@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;
...
}
其他提示
回答Cletus的回答。我会说在id字段上有 @column
注释以及所有序列内容都很重要。使用 @OneToMany
注释的mappedBy参数的另一种方法是使用 @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);
}
}
如果Contact-Phone关系是单向的,您还可以使用 @JoinColumn(name =&quot; contact_id&quot;)<替换
@OneToMany
注释中的 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;
...
}
我认为不需要 addPhone 方法,您只需在手机对象中设置联系人:
phone.setContact(contact);
不隶属于 StackOverflow