Spring Data R2dbc中处理表之间关系的最佳实践

Posted

技术标签:

【中文标题】Spring Data R2dbc中处理表之间关系的最佳实践【英文标题】:Best practice of handling relations between tables in Spring Data R2dbc 【发布时间】:2020-08-26 19:20:19 【问题描述】:

我尝试在 RDBMS 中创建用户/角色关系,并想使用 R2dbc(Spring Data R2dbc) 与后端数据库握手。

假设有三个表,users、roles 和 user_roles。

@Table("users")
class User 
    @Id
    private String username;

    private String password;

    private String email;

    @Builder.Default
    private boolean active = true;

    @Builder.Default
    private List<String> roles = new ArrayList<>();

    @Column("created_at")
    private LocalDateTime createdDate;


与 JPA 不同,R2dbc 重用 spring-data-relational-common(也用于 Spring Data Jdbc)来注释表,但没有解决关系的工具,例如这里的 roles

【问题讨论】:

这真的很令人困惑,因为 @MappedCollection 带有 org.springframework.boot:spring-boot-starter-data-r2dbc:2.3.1.RELEASE 。但是在带有集合变量的实体中使用它会失败。 您可以使用functional interface 将结果映射到多个类 【参考方案1】:

Spring Data R2DBC 目前不支持关系。

因此,您要做的是拥有一个单独的实体 User2Role,它具有两个属性:String usernameString rolename 引用被引用实体的 ID。

由于您还标记了 Spring Data JDBC 问题:Spring Data JDBC 确实支持 1:1 和 1:M 引用,但不支持 M:1 或 M:N 关系。有关这方面的一些背景信息,请参阅 https://spring.io/blog/2018/09/24/spring-data-jdbc-references-and-aggregates。

Spring Data R2DBC 最终可能会迁移到相同的模型。

【讨论】:

以上是关于Spring Data R2dbc中处理表之间关系的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data(数据)R2DBC

Spring认证中国教育管理中心-Spring Data R2DBC框架教程一

Spring Data r2dbc - 实体继承

Spring Data R2DBC响应式操作MySQL

MYSQL R2DBC 的 Spring Data 多主机设置

Spring Data R2DBC 响应式数据库操作使用