From 7f48c5520315e3f5f12044e36769cdfc1aea6ce6 Mon Sep 17 00:00:00 2001 From: wangyu <727842003@qq.com> Date: Sat, 29 Jun 2024 14:08:02 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E5=90=84=E7=A7=8D?= =?UTF-8?q?=E5=85=B3=E8=81=94=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- flyfish-data/flyfish-data-domain/pom.xml | 2 +- .../com/flyfish/framework/domain/po/Role.java | 2 +- .../com/flyfish/framework/domain/po/User.java | 2 +- flyfish-data/flyfish-data-r2dbc/pom.xml | 5 +++ .../r2dbc/config/R2dbcDataConfig.java | 5 +-- .../callback/ReferenceR2dbcCallback.java | 45 ++++++++++++++----- .../r2dbc/metadata/R2dbcTableMetadata.java | 2 +- .../impl/SimpleR2dbcMetadataManager.java | 2 +- .../metadata/reference/R2dbcRelation.java | 2 +- .../framework/r2dbc/domain/TestDO.java | 5 ++- .../src/test/resources/schema.sql | 15 ++++++- .../flyfish-data-relational/README.md | 1 + flyfish-data/flyfish-data-relational/pom.xml | 30 +++++++++++++ .../relational}/mapping/Association.java | 2 +- .../framework/relational/package-info.java | 1 + flyfish-data/pom.xml | 1 + 16 files changed, 97 insertions(+), 25 deletions(-) create mode 100644 flyfish-data/flyfish-data-relational/README.md create mode 100644 flyfish-data/flyfish-data-relational/pom.xml rename flyfish-data/{flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc => flyfish-data-relational/src/main/java/com/flyfish/framework/relational}/mapping/Association.java (95%) create mode 100644 flyfish-data/flyfish-data-relational/src/main/java/com/flyfish/framework/relational/package-info.java diff --git a/flyfish-data/flyfish-data-domain/pom.xml b/flyfish-data/flyfish-data-domain/pom.xml index 9b5a88b..1f71e46 100644 --- a/flyfish-data/flyfish-data-domain/pom.xml +++ b/flyfish-data/flyfish-data-domain/pom.xml @@ -24,7 +24,7 @@ com.flyfish.framework - flyfish-data-r2dbc + flyfish-data-relational ${revision} true diff --git a/flyfish-data/flyfish-data-domain/src/main/java/com/flyfish/framework/domain/po/Role.java b/flyfish-data/flyfish-data-domain/src/main/java/com/flyfish/framework/domain/po/Role.java index 377584a..f1bedd7 100644 --- a/flyfish-data/flyfish-data-domain/src/main/java/com/flyfish/framework/domain/po/Role.java +++ b/flyfish-data/flyfish-data-domain/src/main/java/com/flyfish/framework/domain/po/Role.java @@ -3,7 +3,7 @@ package com.flyfish.framework.domain.po; import com.flyfish.framework.domain.base.AuditDomain; import com.flyfish.framework.enums.NamedEnum; import com.flyfish.framework.enums.RoleType; -import com.flyfish.framework.r2dbc.mapping.Association; +import com.flyfish.framework.relational.mapping.Association; import lombok.*; import org.springframework.data.mongodb.core.mapping.DBRef; import org.springframework.data.mongodb.core.mapping.Document; diff --git a/flyfish-data/flyfish-data-domain/src/main/java/com/flyfish/framework/domain/po/User.java b/flyfish-data/flyfish-data-domain/src/main/java/com/flyfish/framework/domain/po/User.java index 33bd55a..ac444da 100644 --- a/flyfish-data/flyfish-data-domain/src/main/java/com/flyfish/framework/domain/po/User.java +++ b/flyfish-data/flyfish-data-domain/src/main/java/com/flyfish/framework/domain/po/User.java @@ -6,7 +6,7 @@ import com.flyfish.framework.domain.base.AuditDomain; import com.flyfish.framework.domain.base.IUser; import com.flyfish.framework.enums.UserStatus; import com.flyfish.framework.enums.UserType; -import com.flyfish.framework.r2dbc.mapping.Association; +import com.flyfish.framework.relational.mapping.Association; import com.flyfish.framework.validation.spi.ConditionalGroup; import lombok.*; import org.springframework.data.annotation.Transient; diff --git a/flyfish-data/flyfish-data-r2dbc/pom.xml b/flyfish-data/flyfish-data-r2dbc/pom.xml index fe1f8b7..b78bdeb 100644 --- a/flyfish-data/flyfish-data-r2dbc/pom.xml +++ b/flyfish-data/flyfish-data-r2dbc/pom.xml @@ -21,6 +21,11 @@ org.springframework.boot spring-boot-starter-data-r2dbc + + com.flyfish.framework + flyfish-data-relational + ${revision} + io.asyncer r2dbc-mysql diff --git a/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/config/R2dbcDataConfig.java b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/config/R2dbcDataConfig.java index 5302e69..e0d1dc8 100644 --- a/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/config/R2dbcDataConfig.java +++ b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/config/R2dbcDataConfig.java @@ -45,9 +45,8 @@ public class R2dbcDataConfig { } @Bean - public EntityCallback referenceR2dbcCallback(R2dbcEntityOperations entityOperations, R2dbcMetadataManager metadataManager) { - return new ReferenceR2dbcCallback(metadataManager, entityOperations.getDatabaseClient(), entityOperations.getDataAccessStrategy() - .getStatementMapper()); + public EntityCallback referenceR2dbcCallback(R2dbcMetadataManager metadataManager) { + return new ReferenceR2dbcCallback(metadataManager); } @Bean diff --git a/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/config/callback/ReferenceR2dbcCallback.java b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/config/callback/ReferenceR2dbcCallback.java index 50ee424..cff0891 100644 --- a/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/config/callback/ReferenceR2dbcCallback.java +++ b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/config/callback/ReferenceR2dbcCallback.java @@ -19,6 +19,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mapping.PersistentEntity; import org.springframework.data.mapping.PersistentProperty; import org.springframework.data.mapping.PersistentPropertyAccessor; +import org.springframework.data.r2dbc.core.R2dbcEntityOperations; import org.springframework.data.r2dbc.core.StatementMapper; import org.springframework.data.r2dbc.mapping.event.AfterConvertCallback; import org.springframework.data.relational.core.mapping.RelationalPersistentProperty; @@ -43,8 +44,7 @@ import java.util.stream.Collectors; public class ReferenceR2dbcCallback implements AfterConvertCallback { private final R2dbcMetadataManager r2dbcMetadataManager; - private final DatabaseClient databaseClient; - private final StatementMapper statementMapper; + private Lazy operations; private Lazy, DefaultReactiveRepository>> repositories; @Override @@ -77,13 +77,13 @@ public class ReferenceR2dbcCallback implements AfterConvertCallback { // 获取属性设置器 PersistentPropertyAccessor accessor = persistentEntity.getPropertyAccessor(entity); - // 尝试填充一对一关联 + // 尝试填充各种关联方式 List> signals = new ArrayList<>(); signals.addAll(fetchAssociation(metadata.getAssociations(), accessor)); signals.addAll(fetchCollections(metadata.getCollections(), accessor)); - signals.addAll(fetchAssociation()) + signals.addAll(fetchRelations(metadata.getRelations(), accessor)); - // 尝试填充一对多关联 + // 尝试填充 if (CollectionUtils.isNotEmpty(signals)) { return Mono.zip(signals, objs -> entity); } @@ -100,6 +100,11 @@ public class ReferenceR2dbcCallback implements AfterConvertCallback { .collect(Collectors.toMap(repo -> repo.getEntityInformation().getJavaType(), Function.identity()))); } + @Autowired + public void setR2dbcEntityOperations(ObjectProvider operations) { + this.operations = Lazy.of(operations::getIfAvailable); + } + /** * 拉取一对一关联 * @@ -197,13 +202,8 @@ public class ReferenceR2dbcCallback implements AfterConvertCallback { DefaultReactiveRepository repository = getRepository(relation.getEntity().getType()); // 准备查询参数 String id = accessor.getBean().getId(); - StatementMapper.SelectSpec select = statementMapper.createSelect("rel_table") - .withProjection(relation.getForeignField()).withCriteria(Criteria.where(relation.getField()).is(id)); - PreparedOperation operation = statementMapper.getMappedObject(select); - // 执行查询 - Flux ids = databaseClient.sql(operation) - .map(row -> row.get(0, String.class)) - .all(); + // 查询关联id集合 + Flux ids = fetchRelationIds(relation, id); // 准备设置 FieldSetter setter = relation.getSetter(); // 查询最终结果 @@ -217,6 +217,27 @@ public class ReferenceR2dbcCallback implements AfterConvertCallback { return signals; } + /** + * 查询当前实体关联的ids + * + * @param relation 关联信息 + * @return 结果 + */ + private Flux fetchRelationIds(R2dbcRelation relation, String id) { + // 准备查询器 + R2dbcEntityOperations entityOperations = operations.get(); + StatementMapper statementMapper = entityOperations.getDataAccessStrategy().getStatementMapper(); + DatabaseClient databaseClient = entityOperations.getDatabaseClient(); + // 构建查询 + StatementMapper.SelectSpec select = statementMapper.createSelect(relation.getTableName()) + .withProjection(relation.getForeignField()).withCriteria(Criteria.where(relation.getField()).is(id)); + PreparedOperation operation = statementMapper.getMappedObject(select); + // 执行查询 + return databaseClient.sql(operation) + .map(row -> row.get(0, String.class)) + .all(); + } + /** * 通过持久化属性获取真实的列名 * diff --git a/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/R2dbcTableMetadata.java b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/R2dbcTableMetadata.java index 73654a2..6eb3d7a 100644 --- a/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/R2dbcTableMetadata.java +++ b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/R2dbcTableMetadata.java @@ -1,7 +1,7 @@ package com.flyfish.framework.r2dbc.metadata; import com.flyfish.framework.annotations.Property; -import com.flyfish.framework.r2dbc.mapping.Association; +import com.flyfish.framework.relational.mapping.Association; import com.flyfish.framework.r2dbc.metadata.reference.FieldSetter; import com.flyfish.framework.r2dbc.metadata.reference.R2dbcAssociation; import com.flyfish.framework.r2dbc.metadata.reference.R2dbcCollection; diff --git a/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/impl/SimpleR2dbcMetadataManager.java b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/impl/SimpleR2dbcMetadataManager.java index 3c23bc7..e80710f 100644 --- a/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/impl/SimpleR2dbcMetadataManager.java +++ b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/impl/SimpleR2dbcMetadataManager.java @@ -1,6 +1,6 @@ package com.flyfish.framework.r2dbc.metadata.impl; -import com.flyfish.framework.r2dbc.mapping.Association; +import com.flyfish.framework.relational.mapping.Association; import com.flyfish.framework.domain.base.Domain; import com.flyfish.framework.r2dbc.metadata.R2dbcMetadataManager; import com.flyfish.framework.r2dbc.metadata.R2dbcTableMetadata; diff --git a/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/reference/R2dbcRelation.java b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/reference/R2dbcRelation.java index 72b7d39..df81139 100644 --- a/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/reference/R2dbcRelation.java +++ b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/reference/R2dbcRelation.java @@ -1,7 +1,7 @@ package com.flyfish.framework.r2dbc.metadata.reference; import com.flyfish.framework.annotations.Property; -import com.flyfish.framework.r2dbc.mapping.Association; +import com.flyfish.framework.relational.mapping.Association; import lombok.AllArgsConstructor; import lombok.Data; import org.springframework.data.mapping.PersistentEntity; diff --git a/flyfish-data/flyfish-data-r2dbc/src/test/java/com/flyfish/framework/r2dbc/domain/TestDO.java b/flyfish-data/flyfish-data-r2dbc/src/test/java/com/flyfish/framework/r2dbc/domain/TestDO.java index 077a54e..e7775ea 100644 --- a/flyfish-data/flyfish-data-r2dbc/src/test/java/com/flyfish/framework/r2dbc/domain/TestDO.java +++ b/flyfish-data/flyfish-data-r2dbc/src/test/java/com/flyfish/framework/r2dbc/domain/TestDO.java @@ -1,6 +1,6 @@ package com.flyfish.framework.r2dbc.domain; -import com.flyfish.framework.r2dbc.mapping.Association; +import com.flyfish.framework.relational.mapping.Association; import com.flyfish.framework.domain.base.AuditDomain; import com.flyfish.framework.r2dbc.domain.reference.TestAsso; import com.flyfish.framework.r2dbc.domain.reference.TestChild; @@ -32,6 +32,9 @@ public class TestDO extends AuditDomain { @Association private TestOther other; + @Association(relationTable = "test_rel", field = "test_id", foreignField = "other_id") + private List others; + @Association private List children; } diff --git a/flyfish-data/flyfish-data-r2dbc/src/test/resources/schema.sql b/flyfish-data/flyfish-data-r2dbc/src/test/resources/schema.sql index 55d91c3..ae0decb 100644 --- a/flyfish-data/flyfish-data-r2dbc/src/test/resources/schema.sql +++ b/flyfish-data/flyfish-data-r2dbc/src/test/resources/schema.sql @@ -77,8 +77,19 @@ CREATE TABLE IF NOT EXISTS `test_other` `modifier_id` VARCHAR(36) NULL COMMENT '修改人id', `delete` BIT(1) NOT NULL DEFAULT b'0', PRIMARY KEY (`id`) - ) COMMENT '测试关联表'; +) COMMENT '测试关联表'; REPLACE INTO `test_other` VALUES ('1', '1', 'baba ', 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, null, null, null, false), - ('2', '1', 'mama ', 2, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, null, null, null, false); \ No newline at end of file + ('2', '1', 'mama ', 2, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, null, null, null, false), + ('2', '1', 'mama ', 2, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, null, null, null, false); + +CREATE TABLE IF NOT EXISTS `test_rel` +( + `test_id` VARCHAR(36) NOT NULL COMMENT 'test主键', + `other_id` VARCHAR(36) NOT NULL COMMENT 'other主键', + PRIMARY KEY (`test_id`, `other_id`) +) COMMENT '关系表'; + +REPLACE INTO `test_rel` +VALUES ('1', '1'), ('1', '2'), ('1', '3') diff --git a/flyfish-data/flyfish-data-relational/README.md b/flyfish-data/flyfish-data-relational/README.md new file mode 100644 index 0000000..5893741 --- /dev/null +++ b/flyfish-data/flyfish-data-relational/README.md @@ -0,0 +1 @@ +# 关系型数据库通用支持代码 diff --git a/flyfish-data/flyfish-data-relational/pom.xml b/flyfish-data/flyfish-data-relational/pom.xml new file mode 100644 index 0000000..67605dd --- /dev/null +++ b/flyfish-data/flyfish-data-relational/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + + com.flyfish.framework + flyfish-data + ${revision} + + + flyfish-data-relational + + + 8 + 8 + UTF-8 + + + + + org.springframework.data + spring-data-commons + + + org.springframework.data + spring-data-relational + + + diff --git a/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/mapping/Association.java b/flyfish-data/flyfish-data-relational/src/main/java/com/flyfish/framework/relational/mapping/Association.java similarity index 95% rename from flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/mapping/Association.java rename to flyfish-data/flyfish-data-relational/src/main/java/com/flyfish/framework/relational/mapping/Association.java index ecfb04c..b31e7f4 100644 --- a/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/mapping/Association.java +++ b/flyfish-data/flyfish-data-relational/src/main/java/com/flyfish/framework/relational/mapping/Association.java @@ -1,4 +1,4 @@ -package com.flyfish.framework.r2dbc.mapping; +package com.flyfish.framework.relational.mapping; import org.springframework.data.annotation.Transient; diff --git a/flyfish-data/flyfish-data-relational/src/main/java/com/flyfish/framework/relational/package-info.java b/flyfish-data/flyfish-data-relational/src/main/java/com/flyfish/framework/relational/package-info.java new file mode 100644 index 0000000..58c63d5 --- /dev/null +++ b/flyfish-data/flyfish-data-relational/src/main/java/com/flyfish/framework/relational/package-info.java @@ -0,0 +1 @@ +package com.flyfish.framework.relational; diff --git a/flyfish-data/pom.xml b/flyfish-data/pom.xml index 760b8c0..aeee09a 100644 --- a/flyfish-data/pom.xml +++ b/flyfish-data/pom.xml @@ -16,6 +16,7 @@ flyfish-data-mongodb flyfish-data-common flyfish-data-domain + flyfish-data-relational