Skip to content

[feat] database-ptc-object 容器类型参数关联支持 #661

@FxRayHughes

Description

@FxRayHughes

为什么要做

技术改进:database-ptc-object 模块在遇到容器类型的参数时,需要明确的关联机制来正确处理这些类型。

怎么做

扩展现有 API,在 database-ptc-object 模块中增加对容器类型参数的关联支持。

实现方案

1. 容器类型子表存储

数据类中的 List<String>Set<String>Map<String, String> 字段不存储为主表列,而是自动创建独立子表:

  • List 子表parent_{id}, value, sort_order — 通过 sort_order 保持插入顺序
  • Set 子表parent_{id}, value — 无序存储
  • Map 子表parent_{id}, map_key, map_value — 键值对存储

支持 SQLite / MySQL / PostgreSQL 三种数据库,insert/update/delete 时自动同步子表数据。

2. 连接池死锁修复

将读取路径拆分为两阶段:

  • Phase 1(持有连接):读主表 ResultSet 到 Map
  • Phase 2(连接已释放):加载容器子表数据

解决 maximumPoolSize=1 场景下嵌套获取连接导致的超时死锁。

3. Collection Accessor API

新增 DatabaseMap / DatabaseList / DatabaseSet 代理类,实现标准 Kotlin MutableMap / MutableList / MutableSet 接口。用户通过 mapOf() / listOf() / setOf() 获取代理后,像操作普通集合一样使用,所有操作自动转化为 SQL:

val props = mapper.mapOf("player1", "properties")
props["lang"] = "zh_CN"    // → DELETE + INSERT
props["lang"]               // → SELECT
props.remove("lang")        // → DELETE

val tags = mapper.listOf("player1", "tags")
tags.add("newTag")          // → INSERT (append)
tags[0]                     // → SELECT LIMIT 1 OFFSET 0
tags.removeAt(1)            // → DELETE + UPDATE sort_order

修改文件

文件 改动
AnalyzedClass.kt 新增 hasCollectionMembers / collectionMembers
AnalyzedClassMember.kt 新增 isList / isSet / isMap / isCollection
Container.kt 容器接口支持 collectionTableInfos
ContainerOperatorImpl.kt 两阶段读取 + Accessor 工厂方法 + PG 引用修复
ContainerSQL.kt / ContainerSQLite.kt / ContainerPostgreSQL.kt 子表建表逻辑
CollectionTableInfo.kt 新建 — 子表元数据
CollectionAccessor.kt 新建 — DatabaseMap / DatabaseList / DatabaseSet 代理类
DataMapper.kt 接口新增 mapOf / listOf / setOf(各两个重载)
DataMapperImpl.kt / TransactionalDataMapper.kt 实现 Accessor 委托
CollectionTest.kt 新建 — 14 个容器测试用例

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions