У меня есть две сущности, A и B. Мне нужно легко получить сущности A, объединенные с сущностями B, при условии равных значений некоторого столбца (некоторый столбец из A равен некоторому столбцу в B). Эти столбцы не являются первичными или внешними ключами, они содержат одни и те же бизнес-данные. Мне просто нужно иметь доступ из каждого экземпляра A к коллекции B с тем же значением этого столбца. Поэтому я моделирую это так:
class A {
@OneToMany
@JoinColumn(name="column_in_B", referencedColumnName="column_in_A")
Collection<B> bs;
Таким образом, я могу запускать такие запросы, как «выберите A объединить выборку a.bs b, где b ....»
(На самом деле реальные отношения здесь многие-ко-многим. Но когда я использую @ManyToMany, Hibernate заставляет меня использовать таблицу соединений, которой здесь нет. Поэтому я должен использовать @OneToMany в качестве обходного пути).
Все идет нормально. Основная проблема заключается в следующем: всякий раз, когда я удаляю экземпляр A, Hibernate вызывает «Update B set column_in_B = null», потому что он думает, что column_in_B является внешним ключом, указывающим на первичный ключ в A (и поскольку строка в A удалена, он пытается очистить внешний ключ в B). НО column_in_B НЕ ЯВЛЯЕТСЯ внешним ключом и не может быть изменен, потому что он приводит к потере данных (и в любом случае этот столбец НЕ ПУСТО (NULL), что вызывает исключение целочисленности данных).
Пожалуйста, помогите мне с этим. Как моделировать такие отношения с Hibernate? (Я бы назвал это «виртуальными отношениями» или «вторичными отношениями» или около того: поскольку они не основаны на внешних ключах, это всего лишь несколько ярлыков, которые позволяют получать связанные объекты и запрашивать их с помощью HQL)