From 0f27376a5f03dcea7cb9e1c3a8f77de6f128dbde Mon Sep 17 00:00:00 2001 From: wangyu <727842003@qq.com> Date: Thu, 27 Jun 2024 18:03:05 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=85=B3=E8=81=94?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flyfish/framework/domain/base/BaseQo.java | 2 + .../annotations/relation/Association.java | 32 ++++++ .../com/flyfish/framework/domain/base/Qo.java | 5 + .../r2dbc/config/R2dbcDataConfig.java | 11 +- .../callback/ReferenceR2dbcCallback.java | 56 +++++++-- .../r2dbc/metadata/R2dbcMetadataManager.java | 19 ++++ .../r2dbc/metadata/R2dbcTableMetadata.java | 41 +++++++ .../impl/SimpleR2dbcMetadataManager.java | 106 ++++++++++++++++++ .../metadata/reference/R2dbcAssociation.java | 25 +++++ .../metadata/reference/R2dbcCollection.java | 16 +++ .../impl/DefaultReactiveRepositoryImpl.java | 35 ++---- .../framework/r2dbc/R2DbcRepositoryTest.java | 8 +- .../framework/r2dbc/repository/TestDO.java | 10 +- .../src/test/resources/application.yml | 2 +- .../src/test/resources/schema-clean.sql | 1 + .../src/test/resources/schema.sql | 23 +++- 16 files changed, 341 insertions(+), 51 deletions(-) create mode 100644 flyfish-data/flyfish-data-domain/src/main/java/com/flyfish/framework/annotations/relation/Association.java create mode 100644 flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/R2dbcMetadataManager.java create mode 100644 flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/R2dbcTableMetadata.java create mode 100644 flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/impl/SimpleR2dbcMetadataManager.java create mode 100644 flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/reference/R2dbcAssociation.java create mode 100644 flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/reference/R2dbcCollection.java diff --git a/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/domain/base/BaseQo.java b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/domain/base/BaseQo.java index ff8a170..be0ef7e 100644 --- a/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/domain/base/BaseQo.java +++ b/flyfish-data/flyfish-data-common/src/main/java/com/flyfish/framework/domain/base/BaseQo.java @@ -6,6 +6,7 @@ import com.flyfish.framework.query.Query; import com.flyfish.framework.query.QueryDefinition; import com.flyfish.framework.utils.CopyUtils; import lombok.Getter; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Example; import org.springframework.data.domain.Pageable; @@ -35,6 +36,7 @@ public class BaseQo implements Qo { protected List fields; @Getter + @Setter protected boolean fetchRef; public Qo accept(List result, Pageable pageable) { diff --git a/flyfish-data/flyfish-data-domain/src/main/java/com/flyfish/framework/annotations/relation/Association.java b/flyfish-data/flyfish-data-domain/src/main/java/com/flyfish/framework/annotations/relation/Association.java new file mode 100644 index 0000000..ee99ecf --- /dev/null +++ b/flyfish-data/flyfish-data-domain/src/main/java/com/flyfish/framework/annotations/relation/Association.java @@ -0,0 +1,32 @@ +package com.flyfish.framework.annotations.relation; + +import org.springframework.data.annotation.Reference; +import org.springframework.data.annotation.Transient; + +import java.lang.annotation.*; + +/** + * 数据库关联信息 + * + * @author wangyu + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Transient +@Reference +public @interface Association { + + /** + * @return 关联在本对象上的字段名称 + * 如当前表的detail_id字段对应detail表的id字段,则该值为 detail_id + */ + String field() default ""; + + /** + * @return 关联在外部对象上的字段名称,注意,禁止循环依赖 + * 如当前表不存在目标表detail的关联id,目标表关联本实体的id为main_id,则该值为main_id。 + * 与field互斥,同时指定永远都以field为主 + */ + String foreignField() default ""; +} diff --git a/flyfish-data/flyfish-data-domain/src/main/java/com/flyfish/framework/domain/base/Qo.java b/flyfish-data/flyfish-data-domain/src/main/java/com/flyfish/framework/domain/base/Qo.java index 14b8444..db49ea9 100644 --- a/flyfish-data/flyfish-data-domain/src/main/java/com/flyfish/framework/domain/base/Qo.java +++ b/flyfish-data/flyfish-data-domain/src/main/java/com/flyfish/framework/domain/base/Qo.java @@ -16,6 +16,11 @@ import java.util.Optional; */ public interface Qo { + /** + * 查询键 + */ + String KEY = "query"; + /** * 获取分页对象 * 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 de487d3..0175bd5 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 @@ -2,6 +2,8 @@ package com.flyfish.framework.r2dbc.config; import com.flyfish.framework.domain.base.Domain; import com.flyfish.framework.r2dbc.config.callback.ReferenceR2dbcCallback; +import com.flyfish.framework.r2dbc.metadata.R2dbcMetadataManager; +import com.flyfish.framework.r2dbc.metadata.impl.SimpleR2dbcMetadataManager; import com.flyfish.framework.r2dbc.operations.R2dbcReactiveEntityOperations; import com.flyfish.framework.r2dbc.repository.factory.DefaultReactiveRepositoryFactoryBean; import com.flyfish.framework.r2dbc.repository.impl.DefaultReactiveRepositoryImpl; @@ -42,8 +44,13 @@ public class R2dbcDataConfig { } @Bean - public EntityCallback referenceR2dbcCallback() { - return new ReferenceR2dbcCallback(); + public EntityCallback referenceR2dbcCallback(R2dbcMetadataManager metadataManager) { + return new ReferenceR2dbcCallback(metadataManager); + } + + @Bean + public R2dbcMetadataManager r2dbcMetadataManager() { + return new SimpleR2dbcMetadataManager(); } /** 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 8c36d9d..56ec158 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 @@ -1,32 +1,66 @@ package com.flyfish.framework.r2dbc.config.callback; import com.flyfish.framework.domain.base.Domain; -import lombok.Setter; +import com.flyfish.framework.domain.base.Qo; +import com.flyfish.framework.r2dbc.metadata.R2dbcMetadataManager; +import com.flyfish.framework.r2dbc.metadata.R2dbcTableMetadata; +import com.flyfish.framework.repository.DefaultReactiveRepository; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; import org.reactivestreams.Publisher; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.data.mapping.PersistentEntity; -import org.springframework.data.r2dbc.core.R2dbcEntityOperations; import org.springframework.data.r2dbc.mapping.event.AfterConvertCallback; import org.springframework.data.relational.core.sql.SqlIdentifier; +import org.springframework.data.util.Lazy; import org.springframework.lang.NonNull; import reactor.core.publisher.Mono; -public class ReferenceR2dbcCallback implements AfterConvertCallback, ApplicationContextAware { +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; - @Setter - private ApplicationContext applicationContext; +@RequiredArgsConstructor +public class ReferenceR2dbcCallback implements AfterConvertCallback { - @Setter(onMethod_ = @Autowired) - private ObjectProvider entityOperations; + private final R2dbcMetadataManager r2dbcMetadataManager; + private Lazy, DefaultReactiveRepository>> repositories; @Override @NonNull public Publisher onAfterConvert(@NonNull Domain entity, @NonNull SqlIdentifier table) { + return Mono.deferContextual(ctx -> { + Optional> query = ctx.getOrEmpty(Qo.KEY); + query.ifPresent(qo -> entity.setCurrentUser(qo.getUser())); + // 判断是否需要获取关联信息 + boolean fetchRefs = query.map(Qo::isFetchRef).orElse(false); + if (fetchRefs) { + return doFetch(entity); + } + return Mono.just(entity); + }); + } + + /** + * 完成填充 + * + * @param entity 实体 + * @return 结果 + */ + private Mono doFetch(Domain entity) { // 遍历fields,找到要注入的数据 - entityOperations.getIfAvailable(); + R2dbcTableMetadata metadata = r2dbcMetadataManager.getMetadata(entity.getClass()); + // 尝试填充关联 + if (CollectionUtils.isNotEmpty(metadata.getAssociations())) { + + } return Mono.just(entity); } + + @Autowired + public void setRepositories(ObjectProvider> repositories) { + this.repositories = Lazy.of(() -> repositories.stream() + .collect(Collectors.toMap(repo -> repo.getEntityInformation().getJavaType(), Function.identity()))); + } } diff --git a/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/R2dbcMetadataManager.java b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/R2dbcMetadataManager.java new file mode 100644 index 0000000..44919c9 --- /dev/null +++ b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/R2dbcMetadataManager.java @@ -0,0 +1,19 @@ +package com.flyfish.framework.r2dbc.metadata; + +import com.flyfish.framework.domain.base.Domain; + +/** + * r2dbc元数据管理器 + * + * @author wangyu + */ +public interface R2dbcMetadataManager { + + /** + * 获取元数据 + * + * @param entityClass 实体类名 + * @return 结果 + */ + R2dbcTableMetadata getMetadata(Class entityClass); +} 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 new file mode 100644 index 0000000..2ba07ae --- /dev/null +++ b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/R2dbcTableMetadata.java @@ -0,0 +1,41 @@ +package com.flyfish.framework.r2dbc.metadata; + +import com.flyfish.framework.annotations.Property; +import com.flyfish.framework.domain.base.Domain; +import com.flyfish.framework.r2dbc.metadata.reference.R2dbcAssociation; +import com.flyfish.framework.r2dbc.metadata.reference.R2dbcCollection; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +/** + * 表元数据 + * + * @author wangyu + */ +@Data +@Property("表的元数据,用于关联查询") +public class R2dbcTableMetadata { + + @Property("表名") + private String tableName; + + @Property("表实体类名") + private Class entityClass; + + @Property("一对一关联信息") + private List associations = new ArrayList<>(); + + @Property("一对多关联信息") + private List collections = new ArrayList<>(); + + public R2dbcTableMetadata(Class entityClass) { + this.entityClass = entityClass; + } + + public void addAssociation(String field, boolean inner) { + this.associations.add(R2dbcAssociation.of(entityClass, field, inner)); + } + +} 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 new file mode 100644 index 0000000..6817929 --- /dev/null +++ b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/impl/SimpleR2dbcMetadataManager.java @@ -0,0 +1,106 @@ +package com.flyfish.framework.r2dbc.metadata.impl; + +import com.flyfish.framework.annotations.relation.Association; +import com.flyfish.framework.domain.base.Domain; +import com.flyfish.framework.r2dbc.metadata.R2dbcMetadataManager; +import com.flyfish.framework.r2dbc.metadata.R2dbcTableMetadata; +import com.flyfish.framework.r2dbc.metadata.reference.R2dbcAssociation; +import org.apache.commons.lang3.ClassUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.data.mapping.model.Property; +import org.springframework.data.util.ClassTypeInformation; +import org.springframework.lang.NonNull; +import org.springframework.util.ReflectionUtils; + +import java.beans.PropertyDescriptor; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.Collection; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 简单的元数据管理器 + * + * @author wangyu + * 基于线程安全的反射方法进行加载并持有 + */ +public class SimpleR2dbcMetadataManager implements R2dbcMetadataManager { + + private final ConcurrentMap, R2dbcTableMetadata> METADATA_STORE = new ConcurrentHashMap<>(); + + /** + * 获取元数据 + * + * @param entityClass 实体类名 + * @return 结果 + */ + @Override + public R2dbcTableMetadata getMetadata(Class entityClass) { + return METADATA_STORE.computeIfAbsent(entityClass, this::computeMetadata); + } + + /** + * 计算元数据信息 + * + * @param entityClass 实体类 + * @return 结果 + */ + private R2dbcTableMetadata computeMetadata(Class entityClass) { + MetadataCreator creator = new MetadataCreator(entityClass); + ReflectionUtils.doWithFields(entityClass, creator); + return creator.metadata; + } + + private static class MetadataCreator implements ReflectionUtils.FieldCallback { + + private final Map descriptors; + + private final ClassTypeInformation typeInformation; + + private final R2dbcTableMetadata metadata; + + private MetadataCreator(Class entityClass) { + this.descriptors = Arrays.stream(BeanUtils.getPropertyDescriptors(entityClass)) + .collect(Collectors.toMap(PropertyDescriptor::getName, Function.identity())); + this.typeInformation = ClassTypeInformation.from(entityClass); + this.metadata = new R2dbcTableMetadata(entityClass); + } + + /** + * Perform an operation using the given field. + * + * @param field the field to operate on + */ + @Override + public void doWith(@NonNull Field field) throws IllegalArgumentException, IllegalAccessException { + Property property = Property.of(typeInformation, field, descriptors.get(field.getName())); + Class fieldType = property.getType(); + + ReflectionUtils.makeAccessible(field); + + Association association = AnnotatedElementUtils.findMergedAnnotation(field, Association.class); + if (null != association) { + if (ClassUtils.isAssignable(fieldType, Domain.class)) { + // 一对一关联 + if (StringUtils.isNotBlank(association.field())) { + metadata.addAssociation(association.field(), true); + } else if (StringUtils.isNotBlank(association.foreignField())) { + metadata.addAssociation(association.foreignField(), false); + } else { + // 尚且不支持空白策略 + } + } else if (ClassUtils.isAssignable(fieldType, Collection.class)) { + // 一对多关联 + + } + } + } + } +} diff --git a/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/reference/R2dbcAssociation.java b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/reference/R2dbcAssociation.java new file mode 100644 index 0000000..ff9dd4e --- /dev/null +++ b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/reference/R2dbcAssociation.java @@ -0,0 +1,25 @@ +package com.flyfish.framework.r2dbc.metadata.reference; + +import com.flyfish.framework.annotations.Property; +import com.flyfish.framework.domain.base.Domain; +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@Property("一对一关联查询") +@AllArgsConstructor +public class R2dbcAssociation { + + @Property("关联实体类") + private Class entityClass; + + @Property("关联字段") + private String field; + + @Property("字段是否在当前实体内部") + boolean inner; + + public static R2dbcAssociation of(Class entityClass, String field, boolean inner) { + return new R2dbcAssociation(entityClass, field, inner); + } +} diff --git a/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/reference/R2dbcCollection.java b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/reference/R2dbcCollection.java new file mode 100644 index 0000000..3f68f5f --- /dev/null +++ b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/reference/R2dbcCollection.java @@ -0,0 +1,16 @@ +package com.flyfish.framework.r2dbc.metadata.reference; + +import com.flyfish.framework.annotations.Property; +import com.flyfish.framework.domain.base.Domain; +import lombok.Data; + +@Data +@Property("一对多关联查询") +public class R2dbcCollection { + + @Property("关联实体类") + private Class entityClass; + + @Property("关联字段") + private String field; +} diff --git a/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/repository/impl/DefaultReactiveRepositoryImpl.java b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/repository/impl/DefaultReactiveRepositoryImpl.java index 94534be..f51a836 100644 --- a/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/repository/impl/DefaultReactiveRepositoryImpl.java +++ b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/repository/impl/DefaultReactiveRepositoryImpl.java @@ -18,7 +18,6 @@ import org.springframework.data.relational.core.query.Criteria; import org.springframework.data.relational.core.query.Query; import org.springframework.data.relational.repository.query.RelationalEntityInformation; import org.springframework.data.repository.core.EntityInformation; -import org.springframework.data.util.CastUtils; import org.springframework.data.util.Lazy; import org.springframework.lang.NonNull; import org.springframework.util.Assert; @@ -59,12 +58,6 @@ public class DefaultReactiveRepositoryImpl extends SimpleR2dbc .getRequiredPersistentEntity(entity.getJavaType())); } - @Override - @NonNull - public Mono findById(@NonNull String id) { - return super.findById(id).flatMap(this::afterSelect); - } - /** * 通过名称查找一个 * @@ -75,8 +68,7 @@ public class DefaultReactiveRepositoryImpl extends SimpleR2dbc public Mono findByName(String name) { if (StringUtils.isNotBlank(name)) { return entityOperations - .selectOne(Query.query(Criteria.where("name").is(name)), entity.getJavaType()) - .flatMap(this::afterSelect); + .selectOne(Query.query(Criteria.where("name").is(name)), entity.getJavaType()); } return Mono.empty(); } @@ -93,7 +85,7 @@ public class DefaultReactiveRepositoryImpl extends SimpleR2dbc public Mono findOne(Qo query) { return getQuery(query) .flatMap(querying -> entityOperations.selectOne(querying, entity.getJavaType())) - .flatMap(t -> this.afterSelect(query, t)); + .contextWrite(ctx -> ctx.put(Qo.KEY, query)); } /** @@ -106,8 +98,8 @@ public class DefaultReactiveRepositoryImpl extends SimpleR2dbc @Override public Flux findAll(Qo query) { return getQuery(query) - .flatMapMany(querying -> entityOperations.select(querying, entity.getJavaType()) - .flatMap(t -> this.afterSelect(query, t))); + .flatMapMany(querying -> entityOperations.select(querying, entity.getJavaType())) + .contextWrite(ctx -> ctx.put(Qo.KEY, query)); } /** @@ -123,8 +115,8 @@ public class DefaultReactiveRepositoryImpl extends SimpleR2dbc @Override public Flux findAll(Qo query, Sort sort) { return getQuery(query) - .flatMapMany(querying -> entityOperations.select(querying.sort(sort), entity.getJavaType()) - .flatMap(t -> this.afterSelect(query, t))); + .flatMapMany(querying -> entityOperations.select(querying.sort(sort), entity.getJavaType())) + .contextWrite(ctx -> ctx.put(Qo.KEY, query)); } /** @@ -140,10 +132,10 @@ public class DefaultReactiveRepositoryImpl extends SimpleR2dbc return getQuery(query) .flatMap(querying -> entityOperations.select(querying.with(pageable), entity.getJavaType()) - .flatMap(t -> this.afterSelect(query, t)) .collectList() .flatMap(list -> ReactivePageableExecutionUtils.getPage(list, pageable, this.count(query)))) - .defaultIfEmpty(Page.empty()); + .defaultIfEmpty(Page.empty()) + .contextWrite(ctx -> ctx.put(Qo.KEY, query)); } /** @@ -170,7 +162,7 @@ public class DefaultReactiveRepositoryImpl extends SimpleR2dbc public Flux findAllByValues(String key, List values) { Criteria criteria = Criteria.where(key).in(values); Query query = Query.query(criteria); - return entityOperations.select(query, entity.getJavaType()).flatMap(this::afterSelect); + return entityOperations.select(query, entity.getJavaType()); } /** @@ -247,13 +239,4 @@ public class DefaultReactiveRepositoryImpl extends SimpleR2dbc private Mono getQuery(Qo qo) { return Mono.justOrEmpty(qo.getQuery(entity)); } - - private Mono afterSelect(T entity) { - return Mono.just(entity); - } - - private Mono afterSelect(Qo qo, T entity) { - entity.setCurrentUser(qo.getUser()); - return afterSelect(entity); - } } diff --git a/flyfish-data/flyfish-data-r2dbc/src/test/java/com/flyfish/framework/r2dbc/R2DbcRepositoryTest.java b/flyfish-data/flyfish-data-r2dbc/src/test/java/com/flyfish/framework/r2dbc/R2DbcRepositoryTest.java index 7d2ae5a..02ae421 100644 --- a/flyfish-data/flyfish-data-r2dbc/src/test/java/com/flyfish/framework/r2dbc/R2DbcRepositoryTest.java +++ b/flyfish-data/flyfish-data-r2dbc/src/test/java/com/flyfish/framework/r2dbc/R2DbcRepositoryTest.java @@ -4,7 +4,6 @@ import com.flyfish.framework.r2dbc.config.R2dbcDataConfig; import com.flyfish.framework.r2dbc.repository.TestDO; import com.flyfish.framework.r2dbc.repository.TestQO; import com.flyfish.framework.r2dbc.repository.TestRepository; -import com.flyfish.framework.r2dbc.repository.reference.TestAsso; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -26,9 +25,12 @@ public class R2DbcRepositoryTest { @Test public void test() { TestQO qo = new TestQO(); - qo.setName("名"); + qo.setName("2"); + // 开启关联查询 + qo.setFetchRef(true); + TestDO test = new TestDO(); - test.setId("1"); + test.setId("100"); test.setCode("ttt"); test.setName("测试名称"); test.setOtherId("1"); diff --git a/flyfish-data/flyfish-data-r2dbc/src/test/java/com/flyfish/framework/r2dbc/repository/TestDO.java b/flyfish-data/flyfish-data-r2dbc/src/test/java/com/flyfish/framework/r2dbc/repository/TestDO.java index c40b8e9..3328229 100644 --- a/flyfish-data/flyfish-data-r2dbc/src/test/java/com/flyfish/framework/r2dbc/repository/TestDO.java +++ b/flyfish-data/flyfish-data-r2dbc/src/test/java/com/flyfish/framework/r2dbc/repository/TestDO.java @@ -1,11 +1,10 @@ package com.flyfish.framework.r2dbc.repository; +import com.flyfish.framework.annotations.relation.Association; import com.flyfish.framework.domain.base.AuditDomain; import com.flyfish.framework.r2dbc.repository.reference.TestAsso; import com.flyfish.framework.r2dbc.repository.reference.TestChild; import lombok.Data; -import org.springframework.data.annotation.Reference; -import org.springframework.data.annotation.Transient; import org.springframework.data.relational.core.mapping.Column; import org.springframework.data.relational.core.mapping.Table; @@ -16,10 +15,11 @@ import java.util.List; public class TestDO extends AuditDomain { @Column("other_id") - @Reference private String otherId; - @Reference(TestChild.class) - @Transient + @Association(field = "other_id") + private TestAsso asso; + + @Association(foreignField = "parent_id") private List children; } diff --git a/flyfish-data/flyfish-data-r2dbc/src/test/resources/application.yml b/flyfish-data/flyfish-data-r2dbc/src/test/resources/application.yml index 38b133c..3ab7b01 100644 --- a/flyfish-data/flyfish-data-r2dbc/src/test/resources/application.yml +++ b/flyfish-data/flyfish-data-r2dbc/src/test/resources/application.yml @@ -1,5 +1,5 @@ spring: r2dbc: - url: r2dbc:mysql://127.0.0.1:3306/test?allowMultiQueries=true&useUnicode=true&ssl=false&characterEncoding=UTF-8&serverZoneId=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true + url: r2dbc:mysql://127.0.0.1:3306/test?allowMultiQueries=true&useUnicode=true&ssl=true&characterEncoding=UTF-8&serverZoneId=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true username: root password: Unicom#2018 diff --git a/flyfish-data/flyfish-data-r2dbc/src/test/resources/schema-clean.sql b/flyfish-data/flyfish-data-r2dbc/src/test/resources/schema-clean.sql index 466542c..49c9d18 100644 --- a/flyfish-data/flyfish-data-r2dbc/src/test/resources/schema-clean.sql +++ b/flyfish-data/flyfish-data-r2dbc/src/test/resources/schema-clean.sql @@ -1,2 +1,3 @@ DROP TABLE IF EXISTS `test`; DROP TABLE IF EXISTS `test_child`; +DROP TABLE IF EXISTS `test_asso`; 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 90ffb25..a3c7d09 100644 --- a/flyfish-data/flyfish-data-r2dbc/src/test/resources/schema.sql +++ b/flyfish-data/flyfish-data-r2dbc/src/test/resources/schema.sql @@ -3,7 +3,7 @@ CREATE TABLE IF NOT EXISTS `test` `id` VARCHAR(36) NOT NULL COMMENT '主键', `code` VARCHAR(32) NOT NULL COMMENT '编码', `name` VARCHAR(100) NOT NULL COMMENT '名称', - `other_id` VARCHAR(36) NULL COMMENT '其他id', + `other_id` VARCHAR(36) NULL COMMENT '其他id', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `modify_time` DATETIME NOT NULL COMMENT '修改时间', `creator` VARCHAR(36) NULL COMMENT '创建人名称', @@ -14,12 +14,16 @@ CREATE TABLE IF NOT EXISTS `test` PRIMARY KEY (`id`) ) COMMENT '测试表'; +REPLACE INTO `test` +VALUES ('1', '1', '测试1', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, null, null, null, false), + ('2', '2', '测试2', '2', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, null, null, null, false); + CREATE TABLE IF NOT EXISTS `test_child` ( `id` VARCHAR(36) NOT NULL COMMENT '主键', `code` VARCHAR(32) NOT NULL COMMENT '编码', `name` VARCHAR(100) NOT NULL COMMENT '名称', - `parent_id` VARCHAR(36) NOT NULL COMMENT '父id', + `parent_id` VARCHAR(36) NOT NULL COMMENT '父id', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `modify_time` DATETIME NOT NULL COMMENT '修改时间', `creator` VARCHAR(36) NULL COMMENT '创建人名称', @@ -30,6 +34,14 @@ CREATE TABLE IF NOT EXISTS `test_child` PRIMARY KEY (`id`) ) COMMENT '测试子表'; +REPLACE INTO `test_child` +VALUES ('1', '1', '子表1', 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, null, null, null, false), + ('2', '2', '子表2', 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, null, null, null, false), + ('3', '3', '子表3', 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, null, null, null, false), + ('4', '4', '子表4', 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, null, null, null, false), + ('5', '5', '子表5', 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, null, null, null, false); + + CREATE TABLE IF NOT EXISTS `test_asso` ( `id` VARCHAR(36) NOT NULL COMMENT '主键', @@ -43,4 +55,9 @@ CREATE TABLE IF NOT EXISTS `test_asso` `modifier_id` VARCHAR(36) NULL COMMENT '修改人id', `delete` BIT(1) NOT NULL DEFAULT b'0', PRIMARY KEY (`id`) - ) COMMENT '测试关联表'; +) COMMENT '测试关联表'; + + +REPLACE INTO `test_asso` +VALUES ('1', '1', 'baba ', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, null, null, null, false), + ('2', '1', 'mama ', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, null, null, null, false);