Spring / JPA: объект, на который ссылается представление как ассоциация @ManyToOne - PullRequest
0 голосов
/ 11 января 2019

В настоящее время моя база данных организована таким образом, что я имею следующие отношения (в упрощенном виде):

@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 атм.

Что я делаю не так? Это вообще возможно? Что-то еще, что я должен сделать, о котором я не знаю?

1 Ответ

0 голосов
/ 11 января 2019

О, FFS

Теперь я понял свою ошибку. Это:

@JoinColumn(name = "b_id", foreignKey = @ForeignKey(foreignKeyDefinition = "references a(id)"))

Должно было быть так:

@JoinColumn(name = "b_id", foreignKey = @ForeignKey(foreignKeyDefinition = "foreign key(b_id) references a(id)"))

Обратите внимание, что foreignKeyDefinition должен включать foreign key(), а не только references.

Надеюсь, это поможет кому-то в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...