【发布时间】: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