Đầu tiên :
FK của bạn nên tham chiếu PK của thực thể được tham chiếu. Trong trường hợp tức thì, bạn phải có person.conference_room_id
tham chiếu đến conferenceroom.id
. Nếu bạn muốn code
của mình trở thành trường nhận dạng cho ConferenceRoom
thực thể, sau đó không sử dụng khóa thay thế. Nếu mã code
cột không phải là ứng cử viên PK, thì nó cũng không phải là ứng cử viên FK.
Thứ hai :
Merge :
Kiên trì :
Tôi nghĩ rằng bạn đã nhầm lẫn merge
với persist
. Từ những gì tôi có thể biết bằng mã được cung cấp, bạn đang tạo một ConferenceRoom
mới và không sửa đổi một cái hiện có. Do đó, merge
sẽ không làm những gì bạn muốn nó làm. Hãy thử thay đổi phương thức (được cung cấp) của bạn thành như sau:
public ConferenceRoom getNewConferenceRoom(Person p) {
ConferenceRoom r = new ConferenceRoom();
r.setCode("MyUniqueGeneratedCode");
r.getPeople().add(p);
// sessionFactory is spring injected member
sessionFactory.getCurrentSession().persist(r);
}
Những điều này sẽ khắc phục các vấn đề bạn đã nêu ra.