diff --git a/pom.xml b/pom.xml index ad62a7b70242b3ae40f006b893d2e72fa5c031ef..04acf7e45aeada0c53b071396e0a3b1ac37ffb9a 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.gitee.digital-engine spring-domain - 2.7.8 + 2.8.0 pom diff --git a/spring-boot-starter-domain/pom.xml b/spring-boot-starter-domain/pom.xml index 549bcf7760d4c1d1d788dce0f230e5fa4b99c747..5121aab2ee91fcf504a349fdf7cd37da06e73762 100644 --- a/spring-boot-starter-domain/pom.xml +++ b/spring-boot-starter-domain/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine spring-domain - 2.7.8 + 2.8.0 spring-boot-starter-domain diff --git a/spring-domain-coating/pom.xml b/spring-domain-coating/pom.xml index 7ab59f7f6908bfbbdbca4d749cc188c24e8324e1..1e7104ad74e0f2d667455f5795dc88938c8d971c 100644 --- a/spring-domain-coating/pom.xml +++ b/spring-domain-coating/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine spring-domain - 2.7.8 + 2.8.0 spring-domain-coating diff --git a/spring-domain-coating/src/main/java/com/gitee/spring/domain/coating/repository/AbstractChainRepository.java b/spring-domain-coating/src/main/java/com/gitee/spring/domain/coating/repository/AbstractChainRepository.java index 9e3ed9e171789e0bcfd7a56dfc98386bbdc6e1f7..2902d893057280218c21ad07c597dadd4ef20215 100644 --- a/spring-domain-coating/src/main/java/com/gitee/spring/domain/coating/repository/AbstractChainRepository.java +++ b/spring-domain-coating/src/main/java/com/gitee/spring/domain/coating/repository/AbstractChainRepository.java @@ -7,12 +7,13 @@ import com.gitee.spring.domain.coating.entity.PropertyDefinition; import com.gitee.spring.domain.coating.entity.RepositoryDefinition; import com.gitee.spring.domain.coating.entity.RepositoryLocation; import com.gitee.spring.domain.coating.impl.DefaultCoatingAssembler; +import com.gitee.spring.domain.core.api.EntityBinder; +import com.gitee.spring.domain.core.binder.PropertyEntityBinder; import com.gitee.spring.domain.core.entity.BindingDefinition; import com.gitee.spring.domain.core.entity.BoundedContext; import com.gitee.spring.domain.core.entity.EntityCriterion; import com.gitee.spring.domain.core.entity.EntityDefinition; import com.gitee.spring.domain.core.entity.EntityExample; -import com.gitee.spring.domain.core.entity.EntityPropertyChain; import com.gitee.spring.domain.core.repository.ConfiguredRepository; import lombok.extern.slf4j.Slf4j; @@ -24,7 +25,7 @@ import java.util.Map; @Slf4j public abstract class AbstractChainRepository extends AbstractCoatingRepository { - + @Override public EntityExample buildExample(BoundedContext boundedContext, Object coatingObject) { DefaultCoatingAssembler defaultCoatingAssembler = (DefaultCoatingAssembler) classCoatingAssemblerMap.get(coatingObject.getClass()); @@ -76,8 +77,8 @@ public abstract class AbstractChainRepository extends AbstractCoatingRepo EntityDefinition entityDefinition = definitionRepository.getEntityDefinition(); - for (BindingDefinition bindingDefinition : entityDefinition.getBoundBindingDefinitions()) { - String absoluteAccessPath = prefixAccessPath + bindingDefinition.getBelongAccessPath(); + for (PropertyEntityBinder propertyEntityBinder : definitionRepository.getBoundEntityBinders()) { + String absoluteAccessPath = prefixAccessPath + propertyEntityBinder.getBelongAccessPath(); ChainCriterion targetChainCriterion = criterionMap.get(absoluteAccessPath); if (targetChainCriterion != null) { EntityExample targetEntityExample = targetChainCriterion.getEntityExample(); @@ -89,11 +90,11 @@ public abstract class AbstractChainRepository extends AbstractCoatingRepo } if (!entityExample.isEmptyQuery()) { - for (BindingDefinition bindingDefinition : entityDefinition.getContextBindingDefinitions()) { - Object boundValue = boundedContext.get(bindingDefinition.getBindAttribute()); - if (boundValue != null) { - String aliasAttribute = bindingDefinition.getAliasAttribute(); - entityExample.eq(aliasAttribute, boundValue); + for (EntityBinder entityBinder : definitionRepository.getContextEntityBinders()) { + String columnName = entityBinder.getColumnName(); + Object queryParameter = entityBinder.getBoundValue(boundedContext, null); + if (queryParameter != null) { + entityExample.eq(columnName, queryParameter); } } } @@ -108,8 +109,8 @@ public abstract class AbstractChainRepository extends AbstractCoatingRepo entities = configuredRepository.selectByExample(boundedContext, entityExample); } - for (BindingDefinition bindingDefinition : entityDefinition.getBoundBindingDefinitions()) { - String absoluteAccessPath = prefixAccessPath + bindingDefinition.getBelongAccessPath(); + for (PropertyEntityBinder propertyEntityBinder : definitionRepository.getBoundEntityBinders()) { + String absoluteAccessPath = prefixAccessPath + propertyEntityBinder.getBelongAccessPath(); ChainCriterion targetChainCriterion = criterionMap.get(absoluteAccessPath); if (targetChainCriterion != null) { EntityExample targetEntityExample = targetChainCriterion.getEntityExample(); @@ -118,12 +119,13 @@ public abstract class AbstractChainRepository extends AbstractCoatingRepo continue; } - List fieldValues = collectFieldValues(entities, bindingDefinition); + List fieldValues = collectFieldValues(boundedContext, entities, propertyEntityBinder); if (fieldValues.isEmpty()) { targetEntityExample.setEmptyQuery(true); continue; } + BindingDefinition bindingDefinition = propertyEntityBinder.getBindingDefinition(); String bindAliasAttribute = bindingDefinition.getBindAliasAttribute(); Object fieldValue = fieldValues.size() == 1 ? fieldValues.get(0) : fieldValues; targetEntityExample.eq(bindAliasAttribute, fieldValue); @@ -132,11 +134,10 @@ public abstract class AbstractChainRepository extends AbstractCoatingRepo }); } - protected List collectFieldValues(List entities, BindingDefinition bindingDefinition) { - EntityPropertyChain fieldEntityPropertyChain = bindingDefinition.getFieldEntityPropertyChain(); + protected List collectFieldValues(BoundedContext boundedContext, List entities, EntityBinder entityBinder) { List fieldValues = new ArrayList<>(); for (Object entity : entities) { - Object fieldValue = fieldEntityPropertyChain.getValue(entity); + Object fieldValue = entityBinder.getFieldValue(boundedContext, entity); if (fieldValue != null) { fieldValues.add(fieldValue); } diff --git a/spring-domain-core/pom.xml b/spring-domain-core/pom.xml index b0a46506186a4995bd2bc942d45d9456c5f3ee92..e8d2ea587053a81cfd4fe84d94165afd0ed8db06 100644 --- a/spring-domain-core/pom.xml +++ b/spring-domain-core/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine spring-domain - 2.7.8 + 2.8.0 spring-domain-core diff --git a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/annotation/Binding.java b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/annotation/Binding.java index d3dda525283864b9b52192d6be307d5a77733429..9431de30caf694cd5850c6e9cac19b9994d4947d 100644 --- a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/annotation/Binding.java +++ b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/annotation/Binding.java @@ -17,6 +17,8 @@ public @interface Binding { String bind(); + String bindExp() default ""; + String bindAlias() default ""; String property() default ""; diff --git a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/api/EntityBinder.java b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/api/EntityBinder.java new file mode 100644 index 0000000000000000000000000000000000000000..cfa7789bd3c3f34a3749f708be17ef84f8f515ae --- /dev/null +++ b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/api/EntityBinder.java @@ -0,0 +1,20 @@ +package com.gitee.spring.domain.core.api; + +import com.gitee.spring.domain.core.entity.BindingDefinition; +import com.gitee.spring.domain.core.entity.BoundedContext; + +public interface EntityBinder { + + BindingDefinition getBindingDefinition(); + + String getColumnName(); + + Object getBoundValue(BoundedContext boundedContext, Object rootEntity); + + void setBoundValue(BoundedContext boundedContext, Object rootEntity, Object property); + + Object getFieldValue(BoundedContext boundedContext, Object entity); + + void setFieldValue(BoundedContext boundedContext, Object entity, Object property); + +} diff --git a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/binder/AbstractEntityBuilder.java b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/binder/AbstractEntityBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..3988625218d786bb19a3f4cdea59f8b3975adc42 --- /dev/null +++ b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/binder/AbstractEntityBuilder.java @@ -0,0 +1,32 @@ +package com.gitee.spring.domain.core.binder; + +import com.gitee.spring.domain.core.api.EntityBinder; +import com.gitee.spring.domain.core.entity.BindingDefinition; +import com.gitee.spring.domain.core.entity.BoundedContext; +import com.gitee.spring.domain.core.entity.EntityPropertyChain; +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public abstract class AbstractEntityBuilder implements EntityBinder { + + protected BindingDefinition bindingDefinition; + protected EntityPropertyChain fieldEntityPropertyChain; + + @Override + public String getColumnName() { + return bindingDefinition.getAliasAttribute(); + } + + @Override + public Object getFieldValue(BoundedContext boundedContext, Object entity) { + return fieldEntityPropertyChain.getValue(entity); + } + + @Override + public void setFieldValue(BoundedContext boundedContext, Object entity, Object property) { + fieldEntityPropertyChain.setValue(entity, property); + } + +} diff --git a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/binder/ContextEntityBinder.java b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/binder/ContextEntityBinder.java new file mode 100644 index 0000000000000000000000000000000000000000..1fcecbaf5ce8438accdd6899ef1eaf8b5666b52d --- /dev/null +++ b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/binder/ContextEntityBinder.java @@ -0,0 +1,24 @@ +package com.gitee.spring.domain.core.binder; + +import com.gitee.spring.domain.core.entity.BindingDefinition; +import com.gitee.spring.domain.core.entity.BoundedContext; +import com.gitee.spring.domain.core.entity.EntityPropertyChain; + +public class ContextEntityBinder extends AbstractEntityBuilder { + + public ContextEntityBinder(BindingDefinition bindingDefinition, EntityPropertyChain fieldEntityPropertyChain) { + super(bindingDefinition, fieldEntityPropertyChain); + } + + @Override + public Object getBoundValue(BoundedContext boundedContext, Object rootEntity) { + String bindAttribute = bindingDefinition.getBindAttribute(); + return boundedContext.get(bindAttribute); + } + + @Override + public void setBoundValue(BoundedContext boundedContext, Object rootEntity, Object property) { + // ignore + } + +} diff --git a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/binder/PropertyEntityBinder.java b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/binder/PropertyEntityBinder.java new file mode 100644 index 0000000000000000000000000000000000000000..8f6a3f1198d4bb5eaad32aa9b03bc64034021479 --- /dev/null +++ b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/binder/PropertyEntityBinder.java @@ -0,0 +1,47 @@ +package com.gitee.spring.domain.core.binder; + +import com.gitee.spring.domain.core.api.PropertyConverter; +import com.gitee.spring.domain.core.entity.BindingDefinition; +import com.gitee.spring.domain.core.entity.BoundedContext; +import com.gitee.spring.domain.core.entity.EntityPropertyChain; +import com.gitee.spring.domain.core.repository.ConfiguredRepository; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class PropertyEntityBinder extends AbstractEntityBuilder { + + protected String belongAccessPath; + protected ConfiguredRepository belongConfiguredRepository; + protected EntityPropertyChain boundEntityPropertyChain; + protected PropertyConverter propertyConverter; + + public PropertyEntityBinder(BindingDefinition bindingDefinition, + EntityPropertyChain fieldEntityPropertyChain, + String belongAccessPath, + ConfiguredRepository belongConfiguredRepository, + EntityPropertyChain boundEntityPropertyChain, + PropertyConverter propertyConverter) { + super(bindingDefinition, fieldEntityPropertyChain); + this.belongAccessPath = belongAccessPath; + this.belongConfiguredRepository = belongConfiguredRepository; + this.boundEntityPropertyChain = boundEntityPropertyChain; + this.propertyConverter = propertyConverter; + } + + @Override + public Object getBoundValue(BoundedContext boundedContext, Object rootEntity) { + Object boundValue = boundEntityPropertyChain.getValue(rootEntity); + if (boundValue != null) { + boundValue = propertyConverter.convert(boundedContext, boundValue); + } + return boundValue; + } + + @Override + public void setBoundValue(BoundedContext boundedContext, Object rootEntity, Object property) { + boundEntityPropertyChain.setValue(rootEntity, property); + } + +} diff --git a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/constants/Attribute.java b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/constants/Attribute.java index 72334b3f8daf2ca2cf7d128a35431c688eb0fdfc..61dd9e91ee3dd0ce2c37c31e894dbe962e003798 100644 --- a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/constants/Attribute.java +++ b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/constants/Attribute.java @@ -17,6 +17,7 @@ public interface Attribute { String FIELD_ATTRIBUTE = "field"; String ALIAS_ATTRIBUTE = "alias"; String BIND_ATTRIBUTE = "bind"; + String BIND_EXP_ATTRIBUTE = "bindExp"; String BIND_ALIAS_ATTRIBUTE = "bindAlias"; String PROPERTY_ATTRIBUTE = "property"; String CONVERTER_ATTRIBUTE = "converter"; diff --git a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/constants/EntityState.java b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/constants/EntityState.java index e1fad49423cbad4d63501fe39b8d834e0dd03339..cdf8c1fbfd36eeec3483203571efaffb45c11c63 100644 --- a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/constants/EntityState.java +++ b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/constants/EntityState.java @@ -7,5 +7,6 @@ public interface EntityState { int DELETE = 0x00000004; int INSERT_OR_UPDATE = INSERT | UPDATE; int UPDATE_OR_DELETE = UPDATE | DELETE; + int IGNORE = 0x00000008; int FORCE_INSERT = 0x00000008 | INSERT; } diff --git a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/entity/BindingDefinition.java b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/entity/BindingDefinition.java index 954dfe477a338170c49405c8d53f10e7305d9f5b..058e9984ab3f5bd03cada05c2f76ab8a9f5a228f 100644 --- a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/entity/BindingDefinition.java +++ b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/entity/BindingDefinition.java @@ -1,7 +1,5 @@ package com.gitee.spring.domain.core.entity; -import com.gitee.spring.domain.core.api.PropertyConverter; -import com.gitee.spring.domain.core.repository.ConfiguredRepository; import lombok.AllArgsConstructor; import lombok.Data; import org.springframework.core.annotation.AnnotationAttributes; @@ -13,14 +11,7 @@ public class BindingDefinition { private String fieldAttribute; private String aliasAttribute; private String bindAttribute; + private String bindExpAttribute; private String bindAliasAttribute; private String propertyAttribute; - private PropertyConverter propertyConverter; - private boolean fromContext; - private boolean boundId; - private String belongAccessPath; - private ConfiguredRepository belongConfiguredRepository; - private EntityPropertyChain boundEntityPropertyChain; - private boolean fromCollection; - private EntityPropertyChain fieldEntityPropertyChain; } diff --git a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/entity/EntityDefinition.java b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/entity/EntityDefinition.java index 46b0657113df31bb8f32d27029ba6248456e6896..d3279678f01963e5587b2705b67f0d7f592167ae 100644 --- a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/entity/EntityDefinition.java +++ b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/entity/EntityDefinition.java @@ -5,7 +5,6 @@ import lombok.Data; import org.springframework.core.annotation.AnnotationAttributes; import java.lang.reflect.AnnotatedElement; -import java.util.List; import java.util.Map; import java.util.Set; @@ -33,10 +32,6 @@ public class EntityDefinition { private String[] orderBy; private String sort; private int orderAttribute; - private List allBindingDefinitions; - private List boundBindingDefinitions; - private List contextBindingDefinitions; - private BindingDefinition boundIdBindingDefinition; private Set boundColumns; private boolean boundEntity; private Set fieldNames; diff --git a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/entity/ForeignKey.java b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/entity/ForeignKey.java index 3d23f96456b1a9e2b77c58f8208a4b3888150569..5f8ea0a73bf1bc79de650d5c208381af79ffb2cc 100644 --- a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/entity/ForeignKey.java +++ b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/entity/ForeignKey.java @@ -9,14 +9,14 @@ import java.util.List; @Data public class ForeignKey { - - protected ConfiguredRepository configuredRepository; + protected Object rootEntity; + protected ConfiguredRepository configuredRepository; protected List keys; - public ForeignKey(ConfiguredRepository configuredRepository, Object rootEntity) { - this.configuredRepository = configuredRepository; + public ForeignKey(Object rootEntity, ConfiguredRepository configuredRepository) { this.rootEntity = rootEntity; + this.configuredRepository = configuredRepository; } public void mergeFieldValue(String fieldName, Object fieldValue) { diff --git a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/impl/DefaultEntityIndex.java b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/impl/DefaultEntityIndex.java index 96757d8d2b6fa3ce317c582f83d5da30d8d57a46..58f7bc49b09727d40b95a69d59f0c6b1e6e16223 100644 --- a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/impl/DefaultEntityIndex.java +++ b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/impl/DefaultEntityIndex.java @@ -1,9 +1,8 @@ package com.gitee.spring.domain.core.impl; +import com.gitee.spring.domain.core.api.EntityBinder; import com.gitee.spring.domain.core.api.EntityIndex; -import com.gitee.spring.domain.core.entity.BindingDefinition; -import com.gitee.spring.domain.core.entity.EntityDefinition; -import com.gitee.spring.domain.core.entity.EntityPropertyChain; +import com.gitee.spring.domain.core.entity.BoundedContext; import com.gitee.spring.domain.core.entity.ForeignKey; import com.gitee.spring.domain.core.repository.ConfiguredRepository; @@ -16,19 +15,16 @@ import java.util.concurrent.ConcurrentHashMap; public class DefaultEntityIndex implements EntityIndex { - private final Map entitiesMap = new ConcurrentHashMap<>(); + protected final Map entitiesMap = new ConcurrentHashMap<>(); @SuppressWarnings("unchecked") - public DefaultEntityIndex(ConfiguredRepository configuredRepository, List entities) { - EntityDefinition entityDefinition = configuredRepository.getEntityDefinition(); - List bindingDefinitions = entityDefinition.getBoundBindingDefinitions(); + public DefaultEntityIndex(BoundedContext boundedContext, List entities, ConfiguredRepository configuredRepository) { for (Object entity : entities) { StringBuilder builder = new StringBuilder(); - for (BindingDefinition bindingDefinition : bindingDefinitions) { - EntityPropertyChain fieldEntityPropertyChain = bindingDefinition.getFieldEntityPropertyChain(); - Object boundValue = fieldEntityPropertyChain.getValue(entity); - String aliasAttribute = bindingDefinition.getAliasAttribute(); - builder.append(aliasAttribute).append(": ").append(boundValue).append(", "); + for (EntityBinder entityBinder : configuredRepository.getBoundEntityBinders()) { + String columnName = entityBinder.getColumnName(); + Object fieldValue = entityBinder.getFieldValue(boundedContext, entity); + builder.append(columnName).append(": ").append(fieldValue).append(", "); } if (builder.length() > 0) { builder.delete(builder.length() - 2, builder.length()); diff --git a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/impl/EntityStateResolver.java b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/impl/EntityStateResolver.java index 5e8cfe607806e477939b17a51c5b8e09c0fe4d32..a61553ad2a49291701d975b136e3c12569abe262 100644 --- a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/impl/EntityStateResolver.java +++ b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/impl/EntityStateResolver.java @@ -13,7 +13,10 @@ public class EntityStateResolver { String idAttribute = entityDefinition.getIdAttribute(); if (idAttribute != null) { Object boundValue = boundedContext.get(idAttribute); - if ("#forceInsert".equals(boundValue)) { + if ("#ignore".equals(boundValue)) { + return EntityState.IGNORE; + + } else if ("#forceInsert".equals(boundValue)) { return EntityState.FORCE_INSERT; } } @@ -21,12 +24,15 @@ public class EntityStateResolver { } public int resolveEntityState(int expectedEntityState, int contextEntityState, Object entity) { - if (expectedEntityState == EntityState.INSERT_OR_UPDATE) { - return EntityState.INSERT_OR_UPDATE; + if (contextEntityState == EntityState.IGNORE) { + return EntityState.IGNORE; } else if (contextEntityState == EntityState.FORCE_INSERT) { return expectedEntityState & contextEntityState; + } else if (expectedEntityState == EntityState.INSERT_OR_UPDATE) { + return EntityState.INSERT_OR_UPDATE; + } else { Object primaryKey = BeanUtil.getFieldValue(entity, "id"); contextEntityState = primaryKey == null ? EntityState.INSERT : EntityState.UPDATE_OR_DELETE; diff --git a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/repository/AbstractBatchRepository.java b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/repository/AbstractBatchRepository.java index c017bc838ed1720d59ad79524452ddaa0d1c78f9..0e3e68430eec0a2779908e5d31d0602015d4c266 100644 --- a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/repository/AbstractBatchRepository.java +++ b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/repository/AbstractBatchRepository.java @@ -1,17 +1,13 @@ package com.gitee.spring.domain.core.repository; +import com.gitee.spring.domain.core.api.EntityBinder; import com.gitee.spring.domain.core.api.EntityIndex; import com.gitee.spring.domain.core.api.EntityProperty; -import com.gitee.spring.domain.core.api.PropertyConverter; import com.gitee.spring.domain.core.entity.*; import com.gitee.spring.domain.core.impl.DefaultEntityIndex; import lombok.extern.slf4j.Slf4j; -import java.util.ArrayList; -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Slf4j public abstract class AbstractBatchRepository extends AbstractGenericRepository { @@ -49,7 +45,7 @@ public abstract class AbstractBatchRepository extends AbstractGenericRepo EntityExample entityExample = newExampleByRootEntities(boundedContext, rootEntities, configuredRepository, foreignKeys); if (!entityExample.isEmptyQuery() && entityExample.isDirtyQuery()) { List entities = configuredRepository.selectByExample(boundedContext, entityExample); - EntityIndex entityIndex = buildEntityIndex(configuredRepository, entities); + EntityIndex entityIndex = buildEntityIndex(boundedContext, entities, configuredRepository); assembleRootEntities(rootEntities, configuredRepository, foreignKeys, entityIndex); } } @@ -58,49 +54,44 @@ public abstract class AbstractBatchRepository extends AbstractGenericRepo protected EntityExample newExampleByRootEntities(BoundedContext boundedContext, List rootEntities, ConfiguredRepository configuredRepository, List foreignKeys) { - EntityDefinition entityDefinition = configuredRepository.getEntityDefinition(); EntityExample entityExample = new EntityExample(); for (Object rootEntity : rootEntities) { - foreignKeys.add(buildForeignKey(configuredRepository, rootEntity)); + foreignKeys.add(buildForeignKey(rootEntity, configuredRepository)); } - for (BindingDefinition bindingDefinition : entityDefinition.getBoundBindingDefinitions()) { - EntityPropertyChain boundEntityPropertyChain = bindingDefinition.getBoundEntityPropertyChain(); - PropertyConverter propertyConverter = bindingDefinition.getPropertyConverter(); - String aliasAttribute = bindingDefinition.getAliasAttribute(); + for (EntityBinder entityBinder : configuredRepository.getBoundEntityBinders()) { + String columnName = entityBinder.getColumnName(); List fieldValues = new ArrayList<>(); for (int index = 0; index < rootEntities.size(); index++) { Object rootEntity = rootEntities.get(index); - Object boundValue = boundEntityPropertyChain.getValue(rootEntity); - if (boundValue != null) { - boundValue = propertyConverter.convert(boundedContext, boundValue); - if (boundValue instanceof Collection) { - fieldValues.addAll((Collection) boundValue); - } else { - fieldValues.add(boundValue); - } + Object queryParameter = entityBinder.getBoundValue(boundedContext, rootEntity); + if (queryParameter instanceof Collection) { + fieldValues.addAll((Collection) queryParameter); + + } else if (queryParameter != null) { + fieldValues.add(queryParameter); } ForeignKey foreignKey = foreignKeys.get(index); - foreignKey.mergeFieldValue(aliasAttribute, boundValue); + foreignKey.mergeFieldValue(columnName, queryParameter); } if (!fieldValues.isEmpty()) { - entityExample.eq(aliasAttribute, fieldValues); + entityExample.eq(columnName, fieldValues); } else { entityExample.setEmptyQuery(true); break; } } if (!entityExample.isEmptyQuery() && entityExample.isDirtyQuery()) { - newCriterionByContext(boundedContext, configuredRepository, entityExample); + newCriterionByContext(boundedContext, null, configuredRepository, entityExample); } return entityExample; } - protected ForeignKey buildForeignKey(ConfiguredRepository configuredRepository, Object rootEntity) { - return new ForeignKey(configuredRepository, rootEntity); + protected ForeignKey buildForeignKey(Object rootEntity, ConfiguredRepository configuredRepository) { + return new ForeignKey(rootEntity, configuredRepository); } - protected EntityIndex buildEntityIndex(ConfiguredRepository configuredRepository, List entities) { - return new DefaultEntityIndex(configuredRepository, entities); + protected EntityIndex buildEntityIndex(BoundedContext boundedContext, List entities, ConfiguredRepository configuredRepository) { + return new DefaultEntityIndex(boundedContext, entities, configuredRepository); } protected void assembleRootEntities(List rootEntities, ConfiguredRepository configuredRepository, diff --git a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/repository/AbstractContextRepository.java b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/repository/AbstractContextRepository.java index 34260376c7f159a9f5180c86fef446ddf0a4245c..2c68962de3edf2b9b43c5eb9e4708626d120d49c 100644 --- a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/repository/AbstractContextRepository.java +++ b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/repository/AbstractContextRepository.java @@ -6,8 +6,12 @@ import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Entity; import com.gitee.spring.domain.core.annotation.Repository; import com.gitee.spring.domain.core.api.EntityAssembler; +import com.gitee.spring.domain.core.api.EntityBinder; import com.gitee.spring.domain.core.api.EntityMapper; import com.gitee.spring.domain.core.api.PropertyConverter; +import com.gitee.spring.domain.core.binder.AbstractEntityBuilder; +import com.gitee.spring.domain.core.binder.ContextEntityBinder; +import com.gitee.spring.domain.core.binder.PropertyEntityBinder; import com.gitee.spring.domain.core.constants.Attribute; import com.gitee.spring.domain.core.entity.BindingDefinition; import com.gitee.spring.domain.core.entity.EntityDefinition; @@ -200,10 +204,11 @@ public abstract class AbstractContextRepository extends AbstractRepositor Class assemblerClass = attributes.getClass(Attribute.ASSEMBLER_ATTRIBUTE); Class repositoryClass = attributes.getClass(Attribute.REPOSITORY_ATTRIBUTE); - List allBindingDefinitions = new ArrayList<>(); - List boundBindingDefinitions = new ArrayList<>(); - List contextBindingDefinitions = new ArrayList<>(); - BindingDefinition boundIdBindingDefinition = null; + List allEntityBinders = new ArrayList<>(); + List boundEntityBinders = new ArrayList<>(); + List contextEntityBinders = new ArrayList<>(); + PropertyEntityBinder boundIdEntityBinder = null; + Set boundColumns = new LinkedHashSet<>(); for (Binding bindingAnnotation : bindingAnnotations) { @@ -213,6 +218,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor String fieldAttribute = bindingAttributes.getString(Attribute.FIELD_ATTRIBUTE); String aliasAttribute = bindingAttributes.getString(Attribute.ALIAS_ATTRIBUTE); String bindAttribute = bindingAttributes.getString(Attribute.BIND_ATTRIBUTE); + String bindExpAttribute = bindingAttributes.getString(Attribute.BIND_EXP_ATTRIBUTE); String bindAliasAttribute = bindingAttributes.getString(Attribute.BIND_ALIAS_ATTRIBUTE); String propertyAttribute = bindingAttributes.getString(Attribute.PROPERTY_ATTRIBUTE); Class converterClass = bindingAttributes.getClass(Attribute.CONVERTER_ATTRIBUTE); @@ -225,72 +231,69 @@ public abstract class AbstractContextRepository extends AbstractRepositor bindAttribute = PathUtils.getAbsolutePath(accessPath, bindAttribute); } - boolean isIdField = "id".equals(fieldAttribute); + if (StringUtils.isBlank(bindExpAttribute)) { + bindExpAttribute = bindAttribute; + } + boolean isFromContext = !bindAttribute.startsWith("/"); - boolean isBoundId = isIdField && !isFromContext; + boolean isIdField = "id".equals(fieldAttribute); + boolean isBoundId = !isFromContext && isIdField; - String belongAccessPath = null; - ConfiguredRepository belongConfiguredRepository = null; - EntityPropertyChain boundEntityPropertyChain = null; - boolean isFromCollection = false; + if (!isFromContext && StringUtils.isBlank(bindAliasAttribute)) { + bindAliasAttribute = PathUtils.getFieldName(bindAttribute); + } if (!isFromContext) { - if (StringUtils.isBlank(bindAliasAttribute)) { - bindAliasAttribute = PathUtils.getFieldName(bindAttribute); - } + boundColumns.add(StrUtil.toUnderlineCase(aliasAttribute)); + } + + BindingDefinition bindingDefinition = new BindingDefinition( + bindingAttributes, fieldAttribute, aliasAttribute, bindAttribute, bindExpAttribute, bindAliasAttribute, propertyAttribute); - belongAccessPath = PathUtils.getBelongPath(allConfiguredRepositoryMap.keySet(), bindAttribute); - belongConfiguredRepository = allConfiguredRepositoryMap.get(belongAccessPath); + if (!isFromContext) { + String belongAccessPath = PathUtils.getBelongPath(allConfiguredRepositoryMap.keySet(), bindAttribute); + ConfiguredRepository belongConfiguredRepository = allConfiguredRepositoryMap.get(belongAccessPath); Assert.notNull(belongConfiguredRepository, "The belong repository cannot be null!"); EntityDefinition entityDefinition = belongConfiguredRepository.getEntityDefinition(); entityDefinition.setBoundEntity(true); Map allEntityPropertyChainMap = entityPropertiesResolver.getAllEntityPropertyChainMap(); - boundEntityPropertyChain = allEntityPropertyChainMap.get(bindAttribute); + EntityPropertyChain boundEntityPropertyChain = allEntityPropertyChainMap.get(bindAttribute); Assert.notNull(boundEntityPropertyChain, "The bound entity property cannot be null!"); boundEntityPropertyChain.initialize(); - isFromCollection = boundEntityPropertyChain.isCollection(); + PropertyConverter propertyConverter; + if (converterClass == DefaultPropertyConverter.class) { + propertyConverter = new DefaultPropertyConverter(bindingDefinition); - boundColumns.add(StrUtil.toUnderlineCase(aliasAttribute)); - } + } else if (DefaultPropertyConverter.class.isAssignableFrom(converterClass)) { + DefaultPropertyConverter defaultPropertyConverter = (DefaultPropertyConverter) applicationContext.getBean(converterClass); + defaultPropertyConverter.setBindingDefinition(bindingDefinition); + propertyConverter = defaultPropertyConverter; - BindingDefinition bindingDefinition = new BindingDefinition( - bindingAttributes, - fieldAttribute, aliasAttribute, bindAttribute, bindAliasAttribute, - propertyAttribute, null, - isFromContext, isBoundId, - belongAccessPath, belongConfiguredRepository, - boundEntityPropertyChain, isFromCollection, - null); - - PropertyConverter propertyConverter; - if (converterClass == DefaultPropertyConverter.class) { - propertyConverter = new DefaultPropertyConverter(bindingDefinition); - - } else if (DefaultPropertyConverter.class.isAssignableFrom(converterClass)) { - DefaultPropertyConverter defaultPropertyConverter = (DefaultPropertyConverter) applicationContext.getBean(converterClass); - defaultPropertyConverter.setBindingDefinition(bindingDefinition); - propertyConverter = defaultPropertyConverter; + } else { + propertyConverter = (PropertyConverter) applicationContext.getBean(converterClass); + } - } else { - propertyConverter = (PropertyConverter) applicationContext.getBean(converterClass); - } - bindingDefinition.setPropertyConverter(propertyConverter); + PropertyEntityBinder propertyEntityBinder = new PropertyEntityBinder( + bindingDefinition, null, + belongAccessPath, belongConfiguredRepository, + boundEntityPropertyChain, propertyConverter); - allBindingDefinitions.add(bindingDefinition); - if (!isFromContext) { - boundBindingDefinitions.add(bindingDefinition); - } else { - contextBindingDefinitions.add(bindingDefinition); - } + allEntityBinders.add(propertyEntityBinder); + boundEntityBinders.add(propertyEntityBinder); + if (isBoundId) { + boundIdEntityBinder = propertyEntityBinder; + } - if (isBoundId) { - boundIdBindingDefinition = bindingDefinition; + } else { + ContextEntityBinder contextEntityBinder = new ContextEntityBinder(bindingDefinition, null); + allEntityBinders.add(contextEntityBinder); + contextEntityBinders.add(contextEntityBinder); } } - if (boundIdBindingDefinition != null && orderAttribute == 0) { + if (boundIdEntityBinder != null && orderAttribute == 0) { orderAttribute = -1; } @@ -299,8 +302,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor entityClass, isCollection, genericEntityClass, fieldName, attributes, idAttribute, sceneAttribute, mapper, pojoClass, sameType, mappedClass, useEntityExample, mapAsExample, orderByAsc, orderByDesc, orderBy, sort, orderAttribute, - allBindingDefinitions, boundBindingDefinitions, contextBindingDefinitions, boundIdBindingDefinition, boundColumns, - false, new LinkedHashSet<>(), new LinkedHashMap<>()); + boundColumns, false, new LinkedHashSet<>(), new LinkedHashMap<>()); EntityMapper entityMapper = newEntityMapper(entityDefinition); if (mapAsExample) { @@ -339,7 +341,10 @@ public abstract class AbstractContextRepository extends AbstractRepositor } ConfiguredRepository configuredRepository = new ConfiguredRepository( - entityPropertyChain, entityDefinition, entityMapper, entityAssembler, (AbstractRepository) repository); + (AbstractRepository) repository, + entityPropertyChain, entityDefinition, + allEntityBinders, boundEntityBinders, contextEntityBinders, null, boundIdEntityBinder, + entityMapper, entityAssembler); return postProcessRepository(configuredRepository); } @@ -381,13 +386,34 @@ public abstract class AbstractContextRepository extends AbstractRepositor prefixAccessPath = "/"; } - for (BindingDefinition bindingDefinition : entityDefinition.getAllBindingDefinitions()) { - String fieldAccessPath = prefixAccessPath + bindingDefinition.getFieldAttribute(); - EntityPropertyChain entityPropertyChain = entityPropertyChainMap.get(fieldAccessPath); - Assert.notNull(entityPropertyChain, "The field entity property cannot be null!"); - entityPropertyChain.initialize(); - bindingDefinition.setFieldEntityPropertyChain(entityPropertyChain); + List boundValueEntityBinders = new ArrayList<>(); + for (EntityBinder entityBinder : configuredRepository.getAllEntityBinders()) { + BindingDefinition bindingDefinition = entityBinder.getBindingDefinition(); + + if (entityBinder instanceof AbstractEntityBuilder) { + String fieldAccessPath = prefixAccessPath + bindingDefinition.getFieldAttribute(); + EntityPropertyChain entityPropertyChain = entityPropertyChainMap.get(fieldAccessPath); + Assert.notNull(entityPropertyChain, "The field entity property cannot be null!"); + entityPropertyChain.initialize(); + ((AbstractEntityBuilder) entityBinder).setFieldEntityPropertyChain(entityPropertyChain); + } + + if (entityBinder instanceof PropertyEntityBinder) { + PropertyEntityBinder propertyEntityBinder = (PropertyEntityBinder) entityBinder; + boolean isNotBoundId = propertyEntityBinder != configuredRepository.getBoundIdEntityBinder(); + Class entityClass = propertyEntityBinder.getBoundEntityPropertyChain().getEntityClass(); + Class fieldEntityClass = propertyEntityBinder.getFieldEntityPropertyChain().getEntityClass(); + boolean isBlankProperty = StringUtils.isBlank(bindingDefinition.getPropertyAttribute()); + boolean isDefaultConverter = bindingDefinition.getAttributes().getClass(Attribute.CONVERTER_ATTRIBUTE) == DefaultPropertyConverter.class; + if (isNotBoundId && entityClass == fieldEntityClass && isBlankProperty && isDefaultConverter) { + boundValueEntityBinders.add(entityBinder); + } + + } else if (entityBinder instanceof ContextEntityBinder) { + boundValueEntityBinders.add(entityBinder); + } } + configuredRepository.setBoundValueEntityBinders(boundValueEntityBinders); }); } diff --git a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/repository/AbstractGenericRepository.java b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/repository/AbstractGenericRepository.java index e8531df409ec864ff6a70fb0e11846a7b9aee418..76bd772fd9c79e11707ef503d327d3919dd466d1 100644 --- a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/repository/AbstractGenericRepository.java +++ b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/repository/AbstractGenericRepository.java @@ -2,10 +2,7 @@ package com.gitee.spring.domain.core.repository; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.lang.Assert; -import com.gitee.spring.domain.core.api.EntityMapper; -import com.gitee.spring.domain.core.api.EntityProperty; -import com.gitee.spring.domain.core.api.GenericRepository; -import com.gitee.spring.domain.core.api.PropertyConverter; +import com.gitee.spring.domain.core.api.*; import com.gitee.spring.domain.core.constants.EntityState; import com.gitee.spring.domain.core.entity.*; import com.gitee.spring.domain.core.impl.EntityStateResolver; @@ -88,39 +85,36 @@ public abstract class AbstractGenericRepository extends AbstractDelegateR } protected EntityExample newExampleByContext(BoundedContext boundedContext, Object rootEntity, ConfiguredRepository configuredRepository) { - EntityDefinition entityDefinition = configuredRepository.getEntityDefinition(); EntityExample entityExample = new EntityExample(); - for (BindingDefinition bindingDefinition : entityDefinition.getBoundBindingDefinitions()) { - EntityPropertyChain boundEntityPropertyChain = bindingDefinition.getBoundEntityPropertyChain(); - PropertyConverter propertyConverter = bindingDefinition.getPropertyConverter(); - String aliasAttribute = bindingDefinition.getAliasAttribute(); - Object boundValue = boundEntityPropertyChain.getValue(rootEntity); - if (boundValue != null) { - boundValue = propertyConverter.convert(boundedContext, boundValue); - entityExample.eq(aliasAttribute, boundValue); + for (EntityBinder entityBinder : configuredRepository.getBoundEntityBinders()) { + String columnName = entityBinder.getColumnName(); + Object queryParameter = entityBinder.getBoundValue(boundedContext, rootEntity); + if (queryParameter instanceof Collection) { + queryParameter = !((Collection) queryParameter).isEmpty() ? queryParameter : null; + } + if (queryParameter != null) { + entityExample.eq(columnName, queryParameter); } else { entityExample.setEmptyQuery(true); break; } } if (!entityExample.isEmptyQuery() && entityExample.isDirtyQuery()) { - newCriterionByContext(boundedContext, configuredRepository, entityExample); + newCriterionByContext(boundedContext, rootEntity, configuredRepository, entityExample); } return entityExample; } - protected void newCriterionByContext(BoundedContext boundedContext, ConfiguredRepository configuredRepository, EntityExample entityExample) { - EntityDefinition entityDefinition = configuredRepository.getEntityDefinition(); - for (BindingDefinition bindingDefinition : entityDefinition.getContextBindingDefinitions()) { - String bindAttribute = bindingDefinition.getBindAttribute(); - Object boundValue = boundedContext.get(bindAttribute); - if (boundValue != null) { - String aliasAttribute = bindingDefinition.getAliasAttribute(); - if (boundValue instanceof String && StringUtils.isLike((String) boundValue)) { - boundValue = StringUtils.stripLike((String) boundValue); - entityExample.like(aliasAttribute, boundValue); + protected void newCriterionByContext(BoundedContext boundedContext, Object rootEntity, ConfiguredRepository configuredRepository, EntityExample entityExample) { + for (EntityBinder entityBinder : configuredRepository.getContextEntityBinders()) { + String columnName = entityBinder.getColumnName(); + Object queryParameter = entityBinder.getBoundValue(boundedContext, rootEntity); + if (queryParameter != null) { + if (queryParameter instanceof String && StringUtils.isLike((String) queryParameter)) { + queryParameter = StringUtils.stripLike((String) queryParameter); + entityExample.like(columnName, queryParameter); } else { - entityExample.eq(aliasAttribute, boundValue); + entityExample.eq(columnName, queryParameter); } } } @@ -198,41 +192,23 @@ public abstract class AbstractGenericRepository extends AbstractDelegateR } protected void getBoundValueFromContext(BoundedContext boundedContext, Object rootEntity, ConfiguredRepository configuredRepository, Object entity) { - EntityDefinition entityDefinition = configuredRepository.getEntityDefinition(); - for (BindingDefinition bindingDefinition : entityDefinition.getAllBindingDefinitions()) { - if (!bindingDefinition.isBoundId() && !bindingDefinition.isFromCollection()) { - EntityPropertyChain fieldEntityPropertyChain = bindingDefinition.getFieldEntityPropertyChain(); - Object fieldValue = fieldEntityPropertyChain.getValue(entity); - if (fieldValue == null) { - Object boundValue = getBoundValue(boundedContext, rootEntity, bindingDefinition); - if (boundValue != null) { - PropertyConverter propertyConverter = bindingDefinition.getPropertyConverter(); - boundValue = propertyConverter.convert(boundedContext, boundValue); - fieldEntityPropertyChain.setValue(entity, boundValue); - } + for (EntityBinder entityBinder : configuredRepository.getBoundValueEntityBinders()) { + Object fieldValue = entityBinder.getFieldValue(boundedContext, entity); + if (fieldValue == null) { + Object boundValue = entityBinder.getBoundValue(boundedContext, rootEntity); + if (boundValue != null) { + entityBinder.setFieldValue(boundedContext, entity, boundValue); } } } } - protected Object getBoundValue(BoundedContext boundedContext, Object rootEntity, BindingDefinition bindingDefinition) { - if (!bindingDefinition.isFromContext()) { - EntityPropertyChain boundEntityPropertyChain = bindingDefinition.getBoundEntityPropertyChain(); - return boundEntityPropertyChain.getValue(rootEntity); - } else { - String bindAttribute = bindingDefinition.getBindAttribute(); - return boundedContext.get(bindAttribute); - } - } - protected void setBoundIdForBoundEntity(BoundedContext boundedContext, Object rootEntity, ConfiguredRepository configuredRepository, Object entity) { - EntityDefinition entityDefinition = configuredRepository.getEntityDefinition(); - BindingDefinition boundIdBindingDefinition = entityDefinition.getBoundIdBindingDefinition(); - if (boundIdBindingDefinition != null) { - EntityPropertyChain boundEntityPropertyChain = boundIdBindingDefinition.getBoundEntityPropertyChain(); + EntityBinder entityBinder = configuredRepository.getBoundIdEntityBinder(); + if (entityBinder != null) { Object primaryKey = BeanUtil.getFieldValue(entity, "id"); if (primaryKey != null) { - boundEntityPropertyChain.setValue(rootEntity, primaryKey); + entityBinder.setBoundValue(boundedContext, rootEntity, primaryKey); } } } @@ -241,16 +217,12 @@ public abstract class AbstractGenericRepository extends AbstractDelegateR public int updateByExample(BoundedContext boundedContext, Object entity, Object example) { Assert.notNull(entity, "The entity cannot be null!"); int totalCount = 0; - boolean ignoreRoot = boundedContext.containsKey("#ignoreRoot"); - if (ignoreRoot) { - boundedContext.remove("#ignoreRoot"); - } - if (!ignoreRoot && isMatchScenes(boundedContext, getRootRepository())) { - totalCount += getRootRepository().updateByExample(boundedContext, entity, example); - } - for (ConfiguredRepository configuredRepository : getSubRepositories()) { + for (ConfiguredRepository configuredRepository : getOrderedRepositories()) { if (isMatchScenes(boundedContext, configuredRepository)) { - totalCount += configuredRepository.updateByExample(boundedContext, entity, example); + int contextEntityState = entityStateResolver.resolveEntityStateByContext(boundedContext, configuredRepository); + if (contextEntityState == EntityState.NONE) { + totalCount += configuredRepository.updateByExample(boundedContext, entity, example); + } } } return totalCount; @@ -275,16 +247,12 @@ public abstract class AbstractGenericRepository extends AbstractDelegateR @Override public int deleteByExample(BoundedContext boundedContext, Object example) { int totalCount = 0; - boolean ignoreRoot = boundedContext.containsKey("#ignoreRoot"); - if (ignoreRoot) { - boundedContext.remove("#ignoreRoot"); - } - if (!ignoreRoot && isMatchScenes(boundedContext, getRootRepository())) { - totalCount += getRootRepository().deleteByExample(boundedContext, example); - } - for (ConfiguredRepository configuredRepository : getSubRepositories()) { + for (ConfiguredRepository configuredRepository : getOrderedRepositories()) { if (isMatchScenes(boundedContext, configuredRepository)) { - totalCount += configuredRepository.deleteByExample(boundedContext, example); + int contextEntityState = entityStateResolver.resolveEntityStateByContext(boundedContext, configuredRepository); + if (contextEntityState == EntityState.NONE) { + totalCount += configuredRepository.deleteByExample(boundedContext, example); + } } } return totalCount; diff --git a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/repository/ConfiguredRepository.java b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/repository/ConfiguredRepository.java index 94f7a2542e8bf923eb9b79c52e556ae5447ddf6b..0bc29e95b69312ceaa70dbb7e52f1607a2b6687c 100644 --- a/spring-domain-core/src/main/java/com/gitee/spring/domain/core/repository/ConfiguredRepository.java +++ b/spring-domain-core/src/main/java/com/gitee/spring/domain/core/repository/ConfiguredRepository.java @@ -1,7 +1,10 @@ package com.gitee.spring.domain.core.repository; import com.gitee.spring.domain.core.api.EntityAssembler; +import com.gitee.spring.domain.core.api.EntityBinder; import com.gitee.spring.domain.core.api.EntityMapper; +import com.gitee.spring.domain.core.binder.ContextEntityBinder; +import com.gitee.spring.domain.core.binder.PropertyEntityBinder; import com.gitee.spring.domain.core.entity.BoundedContext; import com.gitee.spring.domain.core.entity.EntityDefinition; import com.gitee.spring.domain.core.entity.EntityExample; @@ -18,17 +21,32 @@ public class ConfiguredRepository extends ProxyRepository { protected EntityPropertyChain entityPropertyChain; protected EntityDefinition entityDefinition; + protected List allEntityBinders; + protected List boundEntityBinders; + protected List contextEntityBinders; + protected List boundValueEntityBinders; + protected PropertyEntityBinder boundIdEntityBinder; protected EntityMapper entityMapper; protected EntityAssembler entityAssembler; - public ConfiguredRepository(EntityPropertyChain entityPropertyChain, + public ConfiguredRepository(AbstractRepository repository, + EntityPropertyChain entityPropertyChain, EntityDefinition entityDefinition, + List allEntityBinders, + List boundEntityBinders, + List contextEntityBinders, + List boundValueEntityBinders, + PropertyEntityBinder boundIdEntityBinder, EntityMapper entityMapper, - EntityAssembler entityAssembler, - AbstractRepository repository) { + EntityAssembler entityAssembler) { super(repository); this.entityPropertyChain = entityPropertyChain; this.entityDefinition = entityDefinition; + this.allEntityBinders = allEntityBinders; + this.boundEntityBinders = boundEntityBinders; + this.contextEntityBinders = contextEntityBinders; + this.boundValueEntityBinders = boundValueEntityBinders; + this.boundIdEntityBinder = boundIdEntityBinder; this.entityMapper = entityMapper; this.entityAssembler = entityAssembler; } @@ -37,6 +55,11 @@ public class ConfiguredRepository extends ProxyRepository { super(configuredRepository); this.entityPropertyChain = configuredRepository.getEntityPropertyChain(); this.entityDefinition = configuredRepository.getEntityDefinition(); + this.allEntityBinders = configuredRepository.getAllEntityBinders(); + this.boundEntityBinders = configuredRepository.getBoundEntityBinders(); + this.contextEntityBinders = configuredRepository.getContextEntityBinders(); + this.boundValueEntityBinders = configuredRepository.getBoundValueEntityBinders(); + this.boundIdEntityBinder = configuredRepository.getBoundIdEntityBinder(); this.entityMapper = configuredRepository.getEntityMapper(); this.entityAssembler = configuredRepository.getEntityAssembler(); } diff --git a/spring-domain-event/pom.xml b/spring-domain-event/pom.xml index e565d7378a61583acbf359357de169257bd29e84..3e5be75605a3a2c8dca0c7f1899356ba6f8f6640 100644 --- a/spring-domain-event/pom.xml +++ b/spring-domain-event/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine spring-domain - 2.7.8 + 2.8.0 spring-domain-event diff --git a/spring-domain-injection/pom.xml b/spring-domain-injection/pom.xml index 24cc7a1e93248708e965a4069a98c512c2e67b99..caa5f140d96075cd210a6418be0d94ee33e45aba 100644 --- a/spring-domain-injection/pom.xml +++ b/spring-domain-injection/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine spring-domain - 2.7.8 + 2.8.0 spring-domain-injection diff --git a/spring-domain-web/pom.xml b/spring-domain-web/pom.xml index e43c1a68531fd2f7c09de188e2fb0d6df8788507..493fe3e76b320ae67af57196cb1de0f77c77b293 100644 --- a/spring-domain-web/pom.xml +++ b/spring-domain-web/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine spring-domain - 2.7.8 + 2.8.0 spring-domain-web