質問
SpringとHibernateをJPAプロバイダーとして使用していて、@ OneToMany(多くの電話番号を持つ連絡先)を取得して、電話番号テーブルに外部キーを保存しようとしています。私のフォームから、Phone(numbers)のリストを持つContactオブジェクトを取得します。 Contactは適切に永続化されます(Hibernateは指定されたシーケンスからPKを取得します)。 Phone(numbers)のリストも正しいPKで保持されますが、Contactsテーブルには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;
...
}
他のヒント
クレタスの回答への回答。 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);
}
}
連絡先と電話の関係が単方向の場合、 @OneToMany
注釈の mappedBy
を @JoinColumn(name =&quot; contact_id&quot;)
。
@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