java - 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
引用. 是另一个并不重要的视图,但它是通过子字符串的非平凡比较将表与另一个不相关的表连接起来的结果。完成这些视图是为了让我不需要复制和控制 的哪些元素也显示在.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 atm。
我究竟做错了什么?这甚至可能吗?还有什么我不知道的事情我应该做的吗?
解决方案
哦 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
部分。
希望这对将来的某人有所帮助。
推荐阅读
- python - 使用 API 调用进行抓取的多处理或多线程?
- azure - 使用 Connect-AzAccount 连接到 Azure 时处理连接错误
- sql - 提取具有可变开始和长度的子字符串
- node.js - 转换 NodeJS 字节缓冲区
- docker - Dockerized 烧瓶不能与 dockerized neo4j 一起使用
- linux - 无法在 linux 的 sudo 下运行 .sh 脚本
- android - Android 本机应用程序将主机名解析为与浏览器不同的 IP
- android - 我如何使 fs 工作,我尝试了很多选项,但我无法使其工作
- python - 标准化值,几乎达到最小值
- function - 如果在数据库中未找到每个输入的特定错误消息