【问题标题】:Spring/JPA: Entity referenced by a view as a @ManyToOne associationSpring/JPA:视图引用的实体作为@ManyToOne 关联
【发布时间】:2019-01-11 12:23:19
【问题描述】:

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

@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 表定义,并且具有由基础表定义的外键(如上所述)也很好,以保证数据库的完整性。

但是,当应用上述 sn-p 时,我的排序相关实体表不会像我预期的那样创建外键。作为记录,我使用的是 Hibernate 5.2.16 atm。

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

【问题讨论】:

    标签: java spring postgresql hibernate jpa


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多