首页 > 解决方案 > Spring/JPA:视图引用的实体作为@ManyToOne 关联

问题描述

目前,我的数据库的组织方式具有以下关系(以简化的方式):

@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实体实际上是由 a 定义的,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引用. 是另一个并不重要的视图,但它是通过子字符串的非平凡比较将表与另一个不相关的表连接起来的结果。完成这些视图是为了让我不需要复制和控制 的哪些元素也显示在.Afilter_tablefilter_tableAAB

所有这些都很好。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 atm。

我究竟做错了什么?这甚至可能吗?还有什么我不知道的事情我应该做的吗?

标签: javaspringpostgresqlhibernatejpa

解决方案


哦 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部分。

希望这对将来的某人有所帮助。


推荐阅读