Единственный способ, которым я могу придумать, - это заставить оба отношения через общий класс, к которому C может иметь внешний ключ.
Самый простой способ сделать это - ввести класс X, который будет суперклассом A и B и будет иметь свойства dbId и setOfCs. В таблице С будет столбец X_ID.
В качестве альтернативы, сделать C абстрактным и ввести подклассы Ca и Cb, чтобы экземпляры A всегда ссылались на экземпляры Ca, а экземпляры от B до Cb. Каждому из Ca и Cb потребуется только один внешний ключ. Это может быть очень неудобно для использования, хотя; среди прочего, это означало бы, что вы никогда не сможете перенести экземпляр C из A в B.
Если у вас не было возможности вводить какие-либо базовые классы, вы можете применить закон Уилера и штукатурку к слою косвенного обращения, комбинируя оба вышеуказанных подхода. Создайте абстрактный класс X и присвойте ему свойства dbId и setOfCs из A и B; C затем имеет фантомное отношение ManyToOne к X, и у этой таблицы есть соответствующий внешний ключ. Создайте два конкретных подкласса X, Xa и Xb, каждый из которых имеет отношение OneToOne с экземпляром A или B соответственно, причем эти экземпляры A и B имеют соответствующие отношения OneToOne, указывающие в другом направлении.