В настоящее время моя база данных организована таким образом, что я имею следующие отношения (в упрощенном виде):
@Entity
class A {
/*... class A columns */
@Id @NotNull
private Long id;
}
@Entity
@Immutable
@Table(name = "b_view")
class B {
/* ... same columns as class A, but no setters */
@Id @NotNull
private Long id;
}
Сущность B
фактически определяется как VIEW
, который написан таким образом (при условии Postgres):
CREATE VIEW b_view AS
SELECT a.* FROM a WHERE EXISTS
(SELECT 1 FROM filter_table ft WHERE a.id = ft.b_id);
Идея в том, что B
ссылается на все элементы A
, которые присутствуют в filter_table
. filter_table
- это другое представление, которое на самом деле не важно, но это результат объединения таблицы A
с другой, не связанной таблицей, посредством нетривиального сравнения подстрок. Эти представления сделаны так, что мне не нужно дублировать и контролировать, какие элементы A
также отображаются в B
.
Все это совершенно нормально. JpaRepository
отлично работает для B
(очевидно, без сохранения данных, поскольку B
является неизменным), и все это хорошо.
Однако, в какой-то момент у нас есть сущность, которая имеет отношение к B
объектам:
@Entity
class SortOfRelatedEntity {
/** ... other columns of SortOfRelatedEntity */
@ManyToOne(fetch = FetchType.EAGER, targetEntity = Fornecedor.class)
@JoinColumn(name = "b_id", foreignKey = @ForeignKey(foreignKeyDefinition = "references a(id)"))
private B b;
}
По понятным причинам я не могу сделать эту ссылку внешнего ключа "b", так как B
является представлением. Однако я хочу, чтобы запрос для поиска этого атрибута определялся таблицей b_view
, и наличие внешнего ключа, определяемого базовой таблицей (как написано выше), также было бы неплохо для обеспечения целостности БД.
Однако при применении приведенного выше фрагмента моя таблица родственных сущностей не создает внешний ключ, как я ожидал. Для записи я использую Hibernate 5.2.16 атм.
Что я делаю не так? Это вообще возможно? Что-то еще, что я должен сделать, о котором я не знаю?