跳过ORM的默认行为

1. 跳过作用域过滤

引擎提供了两种在业务操作中临时跳过作用域过滤的方法。以下是具体的实现方式和代码示例,以确保在执行特定业务操作时能够忽略作用域限制,并在操作完成后正确清理上下文,避免对后续操作产生影响。

1.1 整个方法体及其调用链路都忽略作用域过滤

实现说明

  1. 设置忽略作用域标记:在业务方法开始执行前,通过meta.getContext().put(MetaConstant.IGNORE_SCOPE, true)将忽略作用域的标记添加到上下文中。这样整个方法体及其所有调用链路都会跳过作用域过滤。
  2. 执行业务操作:在设置忽略标记后,执行需要跳过作用域过滤的业务逻辑。
  3. 清理作用域标记:无论业务操作成功与否,都应在方法结束时清理作用域标记,确保系统恢复正常的作用域过滤状态。

示例代码

@MethodService(name = "getById", auth = "read")
public TestUser testIgnoreScope(String id) {
    Meta meta = BaseContextHandler.getMeta();
    try {
        meta.getContext().put(MetaConstant.IGNORE_SCOPE, true);
        RecordSet rs = meta.get("TestUser");
        // 整个方法体包含调用链路会忽略作用域过滤
        TestUser results = (TestUser)rs.call("getOrgByUserId", id);
    } finally {
        meta.getContext().remove(MetaConstant.IGNORE_SCOPE);
    }
    // 此处作用域过滤会重新生效
    return selectById(id);
}

注意事项

  • 必须使用try-finally结构:确保无论业务操作是否异常,都能执行清理标记的代码
  • 谨慎使用:仅在确实需要时使用,避免潜在的安全风险
  • 作用范围:此方式会影响当前方法及所有嵌套调用的作用域过滤

1.2 单次调用忽略作用域过滤

实现说明

有时只需要在单次方法调用中跳过作用域过滤,调用结束后立即恢复。这种方法适用于需要在特定操作中临时跳过作用域检查,但不希望影响后续操作的情况。

  1. 添加临时参数:通过meta.addArgument(MetaConstant.IGNORE_SCOPE, true)添加跳过作用域的临时参数
  2. 执行业务操作:执行需要跳过作用域过滤的操作
  3. 参数自动清理:由于是临时参数,方法执行完毕后会自动清理,无需手动移除

示例代码

@MethodService(name = "getOrgByUserId")
public TestUser getOrgByUserId(String id) {
    TestUser testUser = new TestUser();
    testUser.setId(id);

    // 第一次添加跳过参数
    BaseContextHandler.getMeta().addArgument(MetaConstant.IGNORE_SCOPE, true);
    TestOrg testOrg = testUser.getOrg();
    testOrg.search(Filter.greater("age", 10), Arrays.asList("*"), null, null, null);

    // 第二次添加跳过参数(每次调用前都需要重新添加)
    BaseContextHandler.getMeta().addArgument(MetaConstant.IGNORE_SCOPE, true);
    testUser.search(Filter.greater("age", 10), Arrays.asList("*"), null, null, null);

    return testUser.selectById(id);
}

注意事项

  • 参数的有效性:参数仅对当前调用有效,每次需要跳过的操作前都需要重新添加
  • 独立性:每次方法调用都是独立的,参数的添加和清理不会影响其他调用

2. 跳过逻辑删除过滤

在业务场景中,有时需要查询已被逻辑删除的数据。以下方法可以实现这一需求。

实现说明

  1. 设置忽略逻辑删除标记:在查询前添加忽略逻辑删除的标记
  2. 执行数据查询:执行需要查询逻辑删除数据的操作
  3. 清理标记:操作完成后清理标记

示例代码

Meta meta = BaseContextHandler.getMeta();
try {
    // 添加忽略逻辑删除的标记
    meta.addArgument(MetaConstant.IGNORE_LOGIC_DELETE, true);
    
    // 执行业务操作
    
} finally {
    // 清理忽略逻辑删除的标记
    meta.getArguments().remove(MetaConstant.IGNORE_LOGIC_DELETE);
}

注意事项

  • 使用try-finally结构:确保标记被正确清理
  • 数据完整性:注意查询到的数据可能包含已删除记录

3. 跳过数据校验

当业务已经自行完成数据校验时,可以跳过系统的数据校验以提升性能。

实现说明

  1. 设置跳过校验标记:在操作前添加跳过数据校验的标记
  2. 执行业务操作:执行数据新增或修改操作
  3. 清理标记:操作完成后清理标记

示例代码

Meta meta = BaseContextHandler.getMeta();
try {
    // 跳过数据校验(业务侧已自行校验)
    meta.addArgument(MetaConstant.IGNORE_VALIDATE, true);
    
    // 执行业务操作
    
} finally {
    // 清理标记
    meta.getArguments().remove(MetaConstant.IGNORE_VALIDATE);
}

注意事项

  • 必须使用try-finally结构:确保标记被正确清理
  • 确保数据安全:仅在业务已进行完整校验的情况下使用

4. 跳过操作日志记录

在性能敏感的场景中,可以不记录操作日志以提升系统性能。

实现说明

  1. 设置跳过日志标记:在操作前添加跳过操作日志的标记
  2. 执行业务操作:执行数据操作
  3. 清理标记:操作完成后清理标记

示例代码

Meta meta = BaseContextHandler.getMeta();
try {
    // 跳过操作日志记录
    meta.addArgument(MetaConstant.IGNORE_OPERATOR_LOG, true);
    
    // 执行业务操作
    
} finally {
    // 清理标记
    meta.getArguments().remove(MetaConstant.IGNORE_OPERATOR_LOG);
}

注意事项

  • 使用try-finally结构:确保标记被正确清理
  • 审计考虑:跳过日志可能影响操作审计,需谨慎使用

5. 跳过审计字段自动填充

当业务需要自行指定审计字段(如创建人、创建时间、修改人、修改时间)时,可以跳过系统的自动填充。

实现说明

  1. 设置跳过审计标记:在操作前添加跳过审计字段的标记
  2. 执行业务操作:执行数据新增或修改操作
  3. 清理标记:操作完成后清理标记

示例代码

Meta meta = BaseContextHandler.getMeta();
try {
    // 跳过审计字段自动填充
    meta.addArgument(MetaConstant.IGNORE_AUTO_LOG, true);
    
    // 执行业务操作
    
} finally {
    // 清理标记
    meta.getArguments().remove(MetaConstant.IGNORE_AUTO_LOG);
}

注意事项

  • 使用try-finally结构:确保标记被正确清理
  • 数据完整性:业务需自行维护审计字段的准确性

通用注意事项

  1. 清理机制:所有跳过操作都应使用try-finally结构确保标记被清理
  2. 使用场景:仅在确实需要的业务场景中使用跳过功能
  3. 安全性:跳过系统默认行为可能带来安全风险,需谨慎评估
  4. 测试验证:对跳过默认行为的代码进行充分测试