Да, проблема с двунаправленными ассоциациями, где одна сторона является полиморфной (отображается с помощью @Any или @ManyToAny), заключается в том, что Hibernate автоматически генерирует недопустимый внешний ключ . Лично я считаю это ошибкой, а не ошибкой использования.
Вы можете обойти это, явно указав внешний ключ, то есть не полагайтесь на Hibernate для его вывода. Предположим, что в примере «Заимствовать <-> DVD / VHS / Book» требуется двунаправленная ассоциация «многие к одному» между Borrow и DVD / VHS / Book («элемент»), а затем вы отображаете ее на Сторона Взять с полиморфным механизмом @Any для предмета, а сторона item с @OneToMany для заимствования.
НО: в последнем свойстве / получателе вы также явно указываете объединяющий столбец для использования, например. "ITEM_ID". Это должно заставить Hibernate использовать только «ITEM_ID», а не (как я видел) ITEM_ID + ITEM_TYPE, который он выводит по умолчанию из определения @Any на другой стороне.
Если у вас нет суперкласса «Item» для DVD / VHS / Book, вы должны будете объявить это в каждом классе, например:
@Entity
class Book {
...
@OneToMany
@JoinColumn(name="item_id")
public List<Borrow> getBorrows() {
return this.borrows;
}
}