【发布时间】:2021-06-09 15:10:12
【问题描述】:
R2DBC 目前不支持复合键。我想知道我们现在如何实现多对多关系?
例如,给定两个实体:
@Table
class Item(
@Id var id: Long?,
var title: String,
var description: String,
)
@Table
class Tag(
@Id
var id: Long?,
var title: String,
var color: String,
)
及其架构:
CREATE TABLE item (
id SERIAL PRIMARY KEY NOT NULL,
title varchar(100) NOT NULL,
description varchar(500) NOT NULL
);
CREATE TABLE tag (
id SERIAL PRIMARY KEY NOT NULL,
title varchar(100) NOT NULL,
color varchar(6) NOT NULL
);
我可以为多对多映射创建一个表:
CREATE TABLE item_tag (
item_id bigint NOT NULL,
tag_id bigint NOT NULL,
PRIMARY KEY(item_id, tag_id)
);
但是我们应该如何在kotlin/java中定义映射类ItemTag呢?
@Table
class ItemTag(
// ??????????????????????? @Id ?????????????????????
var itemId: Long,
var tagId: Long,
)
或者可以省略@Id?那么班级就不能有Repository吗?我想那会很好。这是唯一的暗示吗?
【问题讨论】:
-
与 JPA 实现不同,R2DBC 中没有关系映射。如果需要,您将不得不手动加载关系。根据您使用的数据库,有几种方法可以做到这一点。
-
我知道,但是如何在不添加ID字段的情况下查询ItemTag表?如果没有 ID 字段,我将无法创建存储库。这就是问题所在。
-
哦,好吧,我会使用
@Transient而不是@ID并加载实体,因为我认为还不支持复合键。 -
您将如何构建查询?没有存储库?
-
只使用普通接口而不是 CrudRepository 并使用
DatabaseClient来实现。如果您需要任何示例,请告诉我。
标签: java spring-data-r2dbc r2dbc r2dbc-postgresql