Я вижу следующие настройки. Хотя это может быть сложно получить работу и, исходя из моего опыта, это ненужная сложность.
class A implements Serializable {
@Id
private PK id = new PK();
@Embeddable
public static final class PK implements Serializable {
@ManyToOne
@JoinColumns ({
@JoinColumn(name="A1_COL", referencedColumnName = "id.a1"),
@JoinColumn(name="A2_COL", referencedColumnName = "id.a2"),
})
B b;
@Basic String a3;
}
}
class B implements Serializable {
@Id
private PK id = new PK();
@Embeddable
public static final class PK implements Serializable {
@Basic String a1;
@Basic String a2;
@Basic String a3;
}
}
Вы должны быть в состоянии получить доступ через
a.getId().getB()
При необходимости добавлять сеттеры / геттеры.
Обычно проблемы такого типа требуют много проб и ошибок, поэтому не ожидайте, что это сработает сразу. Но это должно дать вам направление для копания. После того, как вы определите окончательную конфигурацию, добавьте ее к своему вопросу, чтобы кто-то мог воспользоваться ею в будущем.