当前位置: 首页 > 知识库问答 >
问题:

如何在r2dbc中实现多机

赵永逸
2023-03-14

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?我想那很好。这是唯一的含义吗?

共有1个答案

巫马翰翮
2023-03-14

可能还有其他方法可以做到这一点。因为我认为R2DBC中还不支持CompositeKey。因此,这只是解决问题的一种方法。

数据类

data class ItemTag(val itemId: Long, val tagId: Long)

然后是存储库

interface TagRepository {

    fun getItemTagByTagId(tagId: Long): Flow<ItemTag>
}

Repostories Impl

@Repository
class TagRepositoryImpl(private val databaseClient: DatabaseClient) : TagRepository {
    
    override fun getItemTagByTagId(tagId: Long): Flow<ItemTag> {

        return databaseClient.sql("SELECT * FROM item_tag WHERE tag_id = :tagId")
                             .bind("tagId", tagId)
                             .map(row, _ -> rowToItemTag(row))
                             .all()
                             .flow() 
    }

    private fun rowToItemTag(row: Row): ItemTag {

        return ItemTag(row.get("item_id", Long::class.java)!!, row.get("tag_id", Long::class.java)!!)
    }
    
}

类似的东西。

 类似资料:
  • 本文向大家介绍如何在JavaScript中实现多态?,包括了如何在JavaScript中实现多态?的使用技巧和注意事项,需要的朋友参考一下 多态性 多态 是面向对象编程(OOP)的宗旨之一。它有助于设计对象,使其可以与特定提供的对象共享或覆盖任何行为。多态性 利用继承的 优势来实现这一点。 在以下示例中,子对象(例如“板球”和“网球”)已覆盖从父对象“游戏”调用的“选择”方法,并分别返回了新字符串

  • 在java reactor中,r2dbc。我有两个表A和B。我还为它们定义了存储库。如何获取由连接B组成的数据? 我只提出了以下方法:调用databaseClient。从A中选择,然后在循环调用中从B中选择。 但我想要更有效、更被动的方式。怎么做?

  • 我需要在一个批处理中向一个表中插入多行。在DatabaseClient中,我找到了insert()语句,并使用了(Publisher objectToInsert)方法,该方法有多个对象作为参数。但它是否会将它们放入一批中?另一种可能的解决方案是连接。createBatch(),但它有一个drowback:我无法在那里传递我的实体对象,也无法从实体生成sql查询。 那么,可以在r2dbc中创建批插

  • 问题内容: 我相信标题是不言而喻的。如何在PostgreSQL中创建表结构以建立多对多关系。 我的例子: 问题答案: SQL DDL(数据定义语言)语句如下所示: 我强烈建议您这样做,因为产品名称几乎不是唯一的(不是很好的“自然键”)。此外,强制使用唯一性并在外键中引用该列通常比使用存储为或的字符串便宜(4字节(甚至8字节))。 不要使用基本数据类型的名称作为 标识符 。尽管这是可能的,但这是不好

  • 问题内容: 我正在制作一个具有多对多关系的SQLite数据库,并使用以下代码将其分解为两个一对多的关系 错误: 有谁知道我该如何解决这个错误? 问题答案: 查看文档; 它向您表明,如果您在字段定义本身上指定了外键,则不应使用关键字本身。此外,正如 CL 指出的那样,您使用了太多逗号 。 ,即使单独指定约束,外键名称也不应放在括号中。 该语句可以满足您的要求: 还要注意,如果MODULEID是表MO

  • 我正在做一个小型的laravel项目来实现雄辩的关系,我主要有多个模型(项目、任务、用户、文件等) 一个项目可以分配多个用户,附加多个文件,也可以有多个任务。一个任务可以分配多个用户,也可以分配多个文件,以及多个其他东西。我已经谷歌和实施了hasManyPass,和归属许多关系,但我对关系感到困惑很多。有什么帮助吗? Project.php Task.php User.php 我得到的错误是,当我