|
15 | 15 | import org.hswebframework.ezorm.rdb.mapping.events.ReactiveResultHolder;
|
16 | 16 | import org.hswebframework.ezorm.rdb.metadata.RDBColumnMetadata;
|
17 | 17 | import org.hswebframework.ezorm.rdb.operator.builder.fragments.NativeSql;
|
| 18 | +import org.hswebframework.ezorm.rdb.operator.dml.update.UpdateOperator; |
18 | 19 | import org.hswebframework.web.api.crud.entity.Entity;
|
19 | 20 | import org.hswebframework.web.bean.FastBeanCopier;
|
20 | 21 | import org.hswebframework.web.event.AsyncEvent;
|
@@ -234,25 +235,46 @@ protected void prepareUpdateInstance(List<Object> after, EventContext ctx) {
|
234 | 235 | .orElseThrow(UnsupportedOperationException::new);
|
235 | 236 |
|
236 | 237 | Object afterEntity = after.get(0);
|
| 238 | + Map<String, Object> copy = new HashMap<>(instance); |
237 | 239 |
|
238 |
| - for (Map.Entry<String, Object> entry : instance.entrySet()) { |
239 |
| - RDBColumnMetadata column = mapping.getColumnByName(entry.getKey()).orElse(null); |
240 |
| - if (column == null) { |
| 240 | + Map<String, Object> afterMap = FastBeanCopier.copy(afterEntity, new HashMap<>()); |
| 241 | + |
| 242 | + //设置实体类中指定的字段值 |
| 243 | + for (Map.Entry<String, Object> entry : afterMap.entrySet()) { |
| 244 | + RDBColumnMetadata column = mapping.getColumnByProperty(entry.getKey()).orElse(null); |
| 245 | + if (column == null || !column.isUpdatable()) { |
241 | 246 | continue;
|
242 | 247 | }
|
243 |
| - Object value = entry.getValue(); |
244 |
| - if (value instanceof NullValue || |
245 |
| - value instanceof NativeSql) { |
| 248 | + |
| 249 | + Object origin = copy.remove(column.getAlias()); |
| 250 | + if (origin == null) { |
| 251 | + origin = copy.remove(column.getName()); |
| 252 | + } |
| 253 | + |
| 254 | + //按sql更新 忽略 |
| 255 | + if (origin instanceof NativeSql) { |
246 | 256 | continue;
|
247 | 257 | }
|
248 |
| - entry.setValue( |
249 |
| - GlobalConfig |
250 |
| - .getPropertyOperator() |
251 |
| - .getProperty(afterEntity, column.getAlias()) |
252 |
| - .orElse(entry.getValue()) |
253 |
| - ); |
| 258 | + //设置新的值 |
| 259 | + instance.put(column.getAlias(), entry.getValue()); |
| 260 | + } |
| 261 | + |
| 262 | + DSLUpdate<?, ?> operator = ctx |
| 263 | + .get(ContextKeys.<DSLUpdate<?, ?>>source()) |
| 264 | + .orElse(null); |
| 265 | + if (operator != null) { |
| 266 | + for (Map.Entry<String, Object> entry : copy.entrySet()) { |
| 267 | + Object val = entry.getValue(); |
| 268 | + if (val instanceof NullValue || val instanceof NativeSql) { |
| 269 | + continue; |
| 270 | + } |
| 271 | + for (String col : copy.keySet()) { |
| 272 | + operator.excludes(col); |
| 273 | + } |
| 274 | + } |
254 | 275 |
|
255 | 276 | }
|
| 277 | + |
256 | 278 | }
|
257 | 279 |
|
258 | 280 | protected void handleUpdateBefore(DSLUpdate<?, ?> update, EventContext context) {
|
@@ -286,12 +308,17 @@ protected void handleUpdateBefore(DSLUpdate<?, ?> update, EventContext context)
|
286 | 308 | updated.set(Tuples.of(list, after));
|
287 | 309 | context.set(readyToUpdateBeforeContextKey, list);
|
288 | 310 | context.set(readyToUpdateAfterContextKey, after);
|
| 311 | + EntityPrepareModifyEvent event = new EntityPrepareModifyEvent(list, after, entityType); |
| 312 | + |
289 | 313 | return sendUpdateEvent(list,
|
290 | 314 | after,
|
291 | 315 | entityType,
|
292 |
| - EntityPrepareModifyEvent::new) |
293 |
| - .then(Mono.fromRunnable(() -> prepareUpdateInstance(after, context))) |
294 |
| - ; |
| 316 | + (_list, _after, _type) -> event) |
| 317 | + .then(Mono.fromRunnable(() -> { |
| 318 | + if (event.hasListener()) { |
| 319 | + prepareUpdateInstance(after, context); |
| 320 | + } |
| 321 | + })); |
295 | 322 |
|
296 | 323 | }).then())
|
297 | 324 | );
|
|
0 commit comments