Primero :
Su FK debe hacer referencia a la PK de la entidad a la que se hace referencia. En el caso actual, debe tener person.conference_room_id que hace referencia a conferenceroom.id . Si quieres tu code ser el campo de identificación de la ConferenceRoom entidad, entonces no use una clave sustituta. Si el code columna no es un candidato PK, entonces tampoco es un candidato FK.
Segundo :
Combinar :
Creo que has confundido merge con persist . Por lo que puedo decir por el código proporcionado, está creando una nueva ConferenceRoom y no modificar uno existente. Por lo tanto, merge no va a hacer lo que quieres que haga. Intente cambiar su método (proporcionado) a lo siguiente:
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);
}
Estas cosas deberían solucionar los problemas que ha planteado.