diff --git a/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/config/callback/AssociationWriter.java b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/config/callback/AssociationWriter.java index b8f9060..3518f2a 100644 --- a/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/config/callback/AssociationWriter.java +++ b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/config/callback/AssociationWriter.java @@ -8,7 +8,6 @@ import com.flyfish.framework.r2dbc.metadata.visitor.MetadataHandler; import com.flyfish.framework.repository.DefaultReactiveRepository; import lombok.RequiredArgsConstructor; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; import org.springframework.data.mapping.PersistentEntity; import org.springframework.data.mapping.PersistentProperty; import org.springframework.data.mapping.PersistentPropertyAccessor; @@ -24,7 +23,6 @@ import reactor.core.publisher.Mono; import java.util.List; import java.util.function.Supplier; import java.util.stream.Collectors; -import java.util.stream.Stream; @RequiredArgsConstructor class AssociationWriter implements MetadataHandler { @@ -64,18 +62,18 @@ class AssociationWriter implements MetadataHandler { // 执行逻辑 if (association.isInner()) { // 保存内部关联对象,并设置关联值。如果有id,更新,没有id,插入 - if (StringUtils.isNotBlank(value.getId())) { - // 设置内部id关联 - accessor.setProperty(association.getField(), value.getId()); - // 尝试保存 - return repository.save(value).thenReturn(entity); - } else { + if (association.getEntity().isNew(value)) { // 先保存,再设置 return repository.insert(value).map(saved -> { // 设置内部id关联 accessor.setProperty(association.getField(), saved.getId()); return entity; }); + } else { + // 设置内部id关联 + accessor.setProperty(association.getField(), value.getId()); + // 尝试保存 + return repository.save(value).thenReturn(entity); } } else { // 保存外部关联对象,并更新外部关联当前实体的id @@ -158,18 +156,20 @@ class AssociationWriter implements MetadataHandler { StatementMapper.DeleteSpec deleteSpec = statementMapper.createDelete(relation.getTableName()) .withCriteria(Criteria.where(relation.getField()).is(entity.getId())); PreparedOperation deletion = statementMapper.getMappedObject(deleteSpec); + Mono deleting = execute(databaseClient, deletion, entity); // 构建插入语句,多条 List items = relation.getAccessor().get(entity); - Stream> insertions = items.stream().map(item -> { - StatementMapper.InsertSpec insertion = statementMapper.createInsert(relation.getTableName()) - .withColumn(relation.getField(), Parameter.from(entity.getId())) - .withColumn(relation.getForeignField(), Parameter.from(item.getId())); - return statementMapper.getMappedObject(insertion); - }); + List> insertions = items.stream() + .map(item -> { + StatementMapper.InsertSpec insertion = statementMapper.createInsert(relation.getTableName()) + .withColumn(relation.getField(), Parameter.from(entity.getId())) + .withColumn(relation.getForeignField(), Parameter.from(item.getId())); + return statementMapper.getMappedObject(insertion); + }) + .map(operation -> execute(databaseClient, operation, entity)) + .collect(Collectors.toList()); // 执行查询 - return execute(databaseClient, deletion, entity) - .map(e -> insertions.map(operation -> execute(databaseClient, operation, e)).collect(Collectors.toList())) - .flatMap(list -> Mono.zip(list, results -> entity)); + return deleting.flatMap(list -> Mono.zip(insertions, results -> entity)); } /** @@ -184,6 +184,7 @@ class AssociationWriter implements MetadataHandler { return databaseClient.sql(operation) .map((row -> entity)) .all() + .defaultIfEmpty(entity) .last(); } } diff --git a/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/reference/field/DefaultFieldAccessor.java b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/reference/field/DefaultFieldAccessor.java index 99cc48e..c47b3b3 100644 --- a/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/reference/field/DefaultFieldAccessor.java +++ b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/metadata/reference/field/DefaultFieldAccessor.java @@ -42,7 +42,7 @@ class DefaultFieldAccessor implements FieldAccessor { @Override public R get(T obj) { if (null != descriptor.getReadMethod()) { - return invokeGetter(descriptor.getWriteMethod(), obj); + return invokeGetter(descriptor.getReadMethod(), obj); } return null; } 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 dcafdcf..1ec52ee 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 @@ -5,15 +5,18 @@ import com.alibaba.fastjson.serializer.SerializerFeature; import com.flyfish.framework.r2dbc.config.R2dbcDataConfig; import com.flyfish.framework.r2dbc.domain.TestDO; import com.flyfish.framework.r2dbc.domain.TestQO; +import com.flyfish.framework.r2dbc.repository.TestAssoRepository; import com.flyfish.framework.r2dbc.repository.TestRepository; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; import org.springframework.test.context.junit.jupiter.SpringExtension; import javax.annotation.Resource; +import java.util.List; @ExtendWith(SpringExtension.class) @SpringBootTest(classes = R2DbcRepositoryTest.class) @@ -23,6 +26,8 @@ public class R2DbcRepositoryTest { @Resource private TestRepository testRepository; + @Autowired + private TestAssoRepository testAssoRepository; @Test public void test() { @@ -37,7 +42,13 @@ public class R2DbcRepositoryTest { test.setName("测试名称"); test.setOtherId("1"); + // 打印插入结果 System.out.println(JSON.toJSONString(testRepository.insert(test).block(), SerializerFeature.PrettyFormat)); - System.out.println(JSON.toJSONString(testRepository.findAll(qo).collectList().block(), SerializerFeature.PrettyFormat)); + List all = testRepository.findAll(qo).collectList().block(); + System.out.println(JSON.toJSONString(all, SerializerFeature.PrettyFormat)); + // 修改值并保存测试 + all.get(0).getAsso().setName("修改后的值"); + System.out.println(JSON.toJSONString(testRepository.saveAll(all).collectList().block(), SerializerFeature.PrettyFormat)); + System.out.println(JSON.toJSONString(testAssoRepository.findById("1").block(), SerializerFeature.PrettyFormat)); } }