Skip to content

Commit 0128a7b

Browse files
authored
feat: 增加Extensible接口,可实现此接口来拓展字段. (#81)
1 parent 3bd056c commit 0128a7b

File tree

11 files changed

+187
-63
lines changed

11 files changed

+187
-63
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package org.hswebframework.ezorm.core;
2+
3+
import com.fasterxml.jackson.annotation.JsonAnySetter;
4+
5+
import java.util.Map;
6+
7+
/**
8+
* 可扩展的对象,用于动态拓展实体字段属性
9+
*
10+
* @author zhouhao
11+
* @since 4.1.3
12+
*/
13+
public interface Extensible {
14+
15+
/**
16+
* 获取所有扩展属性
17+
*
18+
* @return 扩展属性
19+
*/
20+
@JsonAnySetter
21+
Map<String, Object> extensions();
22+
23+
/**
24+
* 获取扩展属性
25+
*
26+
* @param property 属性名
27+
* @return 属性值
28+
*/
29+
default Object getExtension(String property) {
30+
Map<String, Object> ext = extensions();
31+
return ext == null ? null : ext.get(property);
32+
}
33+
34+
/**
35+
* 设置扩展属性
36+
*
37+
* @param property 属性名
38+
* @param value 属性值
39+
*/
40+
@JsonAnySetter
41+
void setExtension(String property, Object value);
42+
43+
}

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/defaults/DefaultRepository.java

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,13 @@
22

33
import lombok.Getter;
44
import lombok.Setter;
5+
import org.hswebframework.ezorm.core.Extensible;
56
import org.hswebframework.ezorm.core.GlobalConfig;
6-
import org.hswebframework.ezorm.core.ObjectPropertyOperator;
7-
import org.hswebframework.ezorm.core.RuntimeDefaultValue;
8-
import org.hswebframework.ezorm.rdb.events.ContextKey;
97
import org.hswebframework.ezorm.rdb.events.ContextKeyValue;
108
import org.hswebframework.ezorm.rdb.events.ContextKeys;
11-
import org.hswebframework.ezorm.rdb.executor.NullValue;
129
import org.hswebframework.ezorm.rdb.executor.wrapper.ResultWrapper;
1310
import org.hswebframework.ezorm.rdb.mapping.EntityColumnMapping;
11+
import org.hswebframework.ezorm.rdb.mapping.EntityPropertyDescriptor;
1412
import org.hswebframework.ezorm.rdb.mapping.LazyEntityColumnMapping;
1513
import org.hswebframework.ezorm.rdb.mapping.MappingFeatureType;
1614
import org.hswebframework.ezorm.rdb.mapping.events.EventResultOperator;
@@ -22,18 +20,12 @@
2220
import org.hswebframework.ezorm.rdb.operator.builder.fragments.NativeSql;
2321
import org.hswebframework.ezorm.rdb.operator.dml.insert.InsertOperator;
2422
import org.hswebframework.ezorm.rdb.operator.dml.insert.InsertResultOperator;
25-
import org.hswebframework.ezorm.rdb.operator.dml.upsert.SaveOrUpdateOperator;
2623
import org.hswebframework.ezorm.rdb.operator.dml.upsert.SaveResultOperator;
2724
import org.hswebframework.ezorm.rdb.operator.dml.upsert.UpsertOperator;
28-
import reactor.core.publisher.Mono;
25+
import org.hswebframework.ezorm.rdb.utils.PropertyUtils;
2926

30-
import java.lang.reflect.Array;
31-
import java.lang.reflect.InvocationHandler;
32-
import java.lang.reflect.Method;
33-
import java.lang.reflect.Proxy;
3427
import java.util.*;
3528
import java.util.function.BiConsumer;
36-
import java.util.function.Consumer;
3729
import java.util.function.Supplier;
3830
import java.util.stream.Stream;
3931

@@ -138,24 +130,27 @@ protected Collection<E> tryMergeDuplicate(Collection<E> data) {
138130
}
139131

140132
protected E merge(E older, E newer) {
141-
ObjectPropertyOperator opt = GlobalConfig.getPropertyOperator();
142133
for (String property : getProperties()) {
143-
Object newerVal = opt.getProperty(newer, property).orElse(null);
134+
135+
Object newerVal = getProperty(newer, property);
144136
if (newerVal != null) {
145137
continue;
146138
}
147-
opt.getProperty(older, property)
148-
.ifPresent(olderValue -> opt.setProperty(newer, property, olderValue));
149139

140+
newerVal = getProperty(older, property);
141+
if (newerVal != null) {
142+
setProperty(newer, property, newerVal);
143+
}
150144
}
151145
return newer;
152146
}
153147

154-
private Object getProperty(E data, String property) {
155-
return GlobalConfig
156-
.getPropertyOperator()
157-
.getProperty(data, property)
158-
.orElse(null);
148+
void setProperty(E entity, String property, Object value) {
149+
PropertyUtils.setProperty(entity, property, value, mapping);
150+
}
151+
152+
Object getProperty(E entity, String property) {
153+
return PropertyUtils.getProperty(entity, property, mapping).orElse(null);
159154
}
160155

161156
protected SaveResultOperator doSave(Collection<E> data) {
@@ -213,7 +208,7 @@ protected InsertResultOperator doInsert(E data) {
213208
}
214209

215210
private Object getInsertColumnValue(E data, String property, BiConsumer<String, Object> whenDefaultValue) {
216-
Object value = GlobalConfig.getPropertyOperator().getProperty(data, property).orElse(null);
211+
Object value = getProperty(data, property);
217212
if (value == null) {
218213
value = mapping.getColumnByProperty(property)
219214
.flatMap(RDBColumnMetadata::generateDefaultValue)
@@ -222,7 +217,7 @@ private Object getInsertColumnValue(E data, String property, BiConsumer<String,
222217
whenDefaultValue.accept(property, value);
223218
//回填
224219
if (!(value instanceof NativeSql)) {
225-
GlobalConfig.getPropertyOperator().setProperty(data, property, value);
220+
setProperty(data, property, value);
226221
}
227222
}
228223
}

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/defaults/DefaultUpdate.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
11
package org.hswebframework.ezorm.rdb.mapping.defaults;
22

3-
import org.hswebframework.ezorm.core.NestConditional;
4-
import org.hswebframework.ezorm.core.ObjectPropertyOperator;
5-
import org.hswebframework.ezorm.core.SimpleNestConditional;
3+
import org.hswebframework.ezorm.core.*;
64
import org.hswebframework.ezorm.core.param.Param;
75
import org.hswebframework.ezorm.core.param.QueryParam;
86
import org.hswebframework.ezorm.core.param.Term;
9-
import org.hswebframework.ezorm.core.GlobalConfig;
107
import org.hswebframework.ezorm.core.param.UpdateParam;
118
import org.hswebframework.ezorm.rdb.events.ContextKeyValue;
129
import org.hswebframework.ezorm.rdb.executor.NullValue;
1310
import org.hswebframework.ezorm.rdb.mapping.DSLUpdate;
1411
import org.hswebframework.ezorm.rdb.mapping.EntityColumnMapping;
15-
import org.hswebframework.ezorm.rdb.mapping.MappingFeatureType;
1612
import org.hswebframework.ezorm.rdb.mapping.events.EventResultOperator;
1713
import org.hswebframework.ezorm.rdb.mapping.events.MappingContextKeys;
1814
import org.hswebframework.ezorm.rdb.mapping.events.MappingEventTypes;
@@ -21,7 +17,7 @@
2117
import org.hswebframework.ezorm.rdb.metadata.RDBTableMetadata;
2218
import org.hswebframework.ezorm.rdb.operator.dml.update.UpdateOperator;
2319
import org.hswebframework.ezorm.rdb.operator.dml.update.UpdateResultOperator;
24-
import org.hswebframework.ezorm.rdb.operator.dml.upsert.SaveResultOperator;
20+
import org.hswebframework.ezorm.rdb.utils.PropertyUtils;
2521

2622
import java.sql.JDBCType;
2723
import java.util.*;
@@ -115,12 +111,12 @@ private void applyColumns(E instance) {
115111
.stream()
116112
.filter(e -> includes.isEmpty() || includes.contains(e.getKey()) || includes.contains(e.getValue()))
117113
.filter(e -> !excludes.contains(e.getKey()) && !excludes.contains(e.getValue()))
118-
.forEach(e -> GlobalConfig
119-
.getPropertyOperator()
120-
.getProperty(instance, e.getValue())
114+
.forEach(e -> PropertyUtils
115+
.getProperty(instance, e.getValue(), mapping)
121116
.ifPresent(val -> this.set(e.getKey(), val)));
122117
}
123118

119+
124120
@Override
125121
public ME includes(String... properties) {
126122
includes.addAll(Arrays.asList(properties));

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/wrapper/EntityResultWrapper.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.hswebframework.ezorm.rdb.mapping.EntityColumnMapping;
1010
import org.hswebframework.ezorm.rdb.mapping.MappingFeatureType;
1111
import org.hswebframework.ezorm.rdb.metadata.RDBTableMetadata;
12+
import org.hswebframework.ezorm.rdb.utils.PropertyUtils;
1213

1314
import java.util.Optional;
1415
import java.util.function.Supplier;
@@ -46,7 +47,7 @@ public void wrapColumn(ColumnWrapperContext<E> context) {
4647
.map(columnMetadata -> columnMetadata.decode(context.getResult()))
4748
.orElseGet(context::getResult);
4849
if (value != null) {
49-
GlobalConfig.getPropertyOperator().setProperty(context.getRowInstance(), property, value);
50+
PropertyUtils.setProperty(context.getRowInstance(), property, value,mapping);
5051
}
5152
}
5253

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/wrapper/NestedEntityResultWrapper.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package org.hswebframework.ezorm.rdb.mapping.wrapper;
22

3+
import org.hswebframework.ezorm.core.Extensible;
34
import org.hswebframework.ezorm.core.GlobalConfig;
45
import org.hswebframework.ezorm.rdb.executor.wrapper.ColumnWrapperContext;
56
import org.hswebframework.ezorm.rdb.executor.wrapper.ResultWrapper;
67
import org.hswebframework.ezorm.rdb.mapping.EntityColumnMapping;
8+
import org.hswebframework.ezorm.rdb.mapping.EntityPropertyDescriptor;
9+
import org.hswebframework.ezorm.rdb.metadata.RDBColumnMetadata;
710
import org.hswebframework.ezorm.rdb.metadata.key.ForeignKeyMetadata;
811

912
public class NestedEntityResultWrapper<E> implements ResultWrapper<E, E> {
@@ -37,18 +40,31 @@ public void wrapColumn(ColumnWrapperContext<E> context) {
3740
}
3841
ForeignKeyMetadata metadata = mapping.getTable().getForeignKey(table).orElse(null);
3942
if (null != metadata) {
40-
Object value = metadata
41-
.getTarget()
42-
.getColumn(column)
43-
.map(m -> m.decode(context.getResult()))
44-
.orElseGet(context::getResult);
45-
GlobalConfig.getPropertyOperator().setProperty(nestInstance, column, value);
43+
RDBColumnMetadata col = metadata.getTarget().getColumn(column).orElse(null);
44+
45+
Object val = col == null ? context.getResult() : col.decode(context.getResult());
46+
47+
setProperty(col, context.getRowInstance(), label, val);
4648
}
4749
} else {
48-
GlobalConfig.getPropertyOperator().setProperty(context.getRowInstance(), label, context.getResult());
50+
setProperty(mapping.getColumnByProperty(label).orElse(null),
51+
context.getRowInstance(),
52+
label,
53+
context.getResult());
4954
}
5055
}
5156

57+
protected void setProperty(RDBColumnMetadata col, E instance, String label, Object val) {
58+
if (instance instanceof Extensible && (col == null || !col
59+
.getFeature(EntityPropertyDescriptor.ID)
60+
.isPresent())) {
61+
((Extensible) instance).setExtension(label, val);
62+
} else {
63+
GlobalConfig.getPropertyOperator().setProperty(instance, label, val);
64+
}
65+
66+
}
67+
5268
@Override
5369
public boolean completedWrapRow(E result) {
5470
return true;

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/operator/dml/query/BuildParameterQueryOperator.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,18 @@ public BuildParameterQueryOperator(String from) {
3535

3636
@Override
3737
public QueryOperator select(Collection<String> columns) {
38-
39-
columns.stream()
40-
.map(SelectColumn::of)
41-
.forEach(parameter.getSelect()::add);
38+
for (String column : columns) {
39+
parameter.getSelect().add(SelectColumn.of(column));
40+
}
4241
return this;
4342
}
4443

4544
@Override
4645
public QueryOperator select(String... columns) {
47-
return select(Arrays.asList(columns));
46+
for (String column : columns) {
47+
parameter.getSelect().add(SelectColumn.of(column));
48+
}
49+
return this;
4850
}
4951

5052
@Override
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package org.hswebframework.ezorm.rdb.utils;
2+
3+
import org.hswebframework.ezorm.core.Extensible;
4+
import org.hswebframework.ezorm.core.GlobalConfig;
5+
import org.hswebframework.ezorm.core.ObjectPropertyOperator;
6+
import org.hswebframework.ezorm.rdb.mapping.EntityColumnMapping;
7+
import org.hswebframework.ezorm.rdb.mapping.EntityPropertyDescriptor;
8+
9+
import java.util.Optional;
10+
11+
public class PropertyUtils {
12+
13+
public static Optional<Object> getProperty(Object entity, String property, EntityColumnMapping mapping) {
14+
ObjectPropertyOperator opt = GlobalConfig.getPropertyOperator();
15+
if (entity instanceof Extensible && isExtensibleColumn(property, mapping)) {
16+
return Optional.ofNullable(((Extensible) entity).getExtension(property));
17+
}
18+
return opt.getProperty(entity, property);
19+
}
20+
21+
public static boolean isExtensibleColumn(String property, EntityColumnMapping mapping) {
22+
return mapping
23+
.getColumnByProperty(property)
24+
.map(c -> !c.getFeature(EntityPropertyDescriptor.ID).isPresent())
25+
.orElse(true);
26+
}
27+
28+
public static void setProperty(Object entity, String property, Object value, EntityColumnMapping mapping) {
29+
if (entity instanceof Extensible && isExtensibleColumn(property, mapping)) {
30+
((Extensible) entity).setExtension(property, value);
31+
} else {
32+
GlobalConfig.getPropertyOperator().setProperty(entity, property, value);
33+
}
34+
}
35+
}

hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/Containers.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import org.testcontainers.containers.wait.strategy.Wait;
55
import org.testcontainers.utility.DockerImageName;
66

7+
import java.time.Duration;
8+
79
public class Containers {
810

911
public static GenericContainer<?> newMysql(String version) {
@@ -32,7 +34,7 @@ public static GenericContainer<?> newOracle() {
3234
return new GenericContainer<>(DockerImageName.parse("iatebes/oracle_11g"))
3335
.withEnv("TZ", "Asia/Shanghai")
3436
.withExposedPorts(1521)
35-
.waitingFor(Wait.forLogMessage(".*opened.*", 1));
37+
.waitingFor(Wait.forLogMessage(".*opened.*", 1).withStartupTimeout(Duration.ofMinutes(2)));
3638
}
3739

3840
public static GenericContainer<?> newMSSQL() {
@@ -42,7 +44,7 @@ public static GenericContainer<?> newMSSQL() {
4244
.withEnv("ACCEPT_EULA","y")
4345
.withEnv("MSSQL_PID","Enterprise")
4446
.withExposedPorts(1433)
45-
.waitingFor(Wait.forLogMessage(".*Service Broker manager has started.*",1));
47+
.waitingFor(Wait.forLogMessage(".*Service Broker manager has started.*",1).withStartupTimeout(Duration.ofMinutes(2)));
4648
}
4749

4850
}

0 commit comments

Comments
 (0)