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