В справочной документации Hibernate есть пример, который полностью аналогичен вашему случаю. Прямо перед этим примером вы найдете объяснения. Вот пример, который соответствует вашей проблеме (пользователь - таблица A, а клиент - таблица B):
@Entity
class Customer {
@EmbeddedId CustomerId id;
boolean preferredCustomer;
@MapsId("userId")
@JoinColumns({
@JoinColumn(name="userfirstname_fk", referencedColumnName="firstName"),
@JoinColumn(name="userlastname_fk", referencedColumnName="lastName")
})
@OneToOne User user;
}
@Embeddable
class CustomerId implements Serializable {
UserId userId;
String customerNumber;
//implements equals and hashCode
}
@Entity
class User {
@EmbeddedId UserId id;
Integer age;
}
@Embeddable
class UserId implements Serializable {
String firstName;
String lastName;
//implements equals and hashCode
}
Примечание: было бы намного проще, если бы у вас был суррогатный идентификатор для этих двух таблиц. Если вы не вынуждены иметь дело с устаревшей схемой, сделайте себе одолжение и используйте суррогатные ключи.