当前位置: 首页 > 知识库问答 >
问题:

Spring BootJPA实体生命周期事件

国阳
2023-03-14

我需要检查当前租户是否正在更新自己的实体,并使用了@PreUpdate注释。如果我传递了完整的对象<code>存储库。save()方法我获得了必要的tenantId,但一旦我传递了DTO(通过映射器映射到实体), 就为空。既然启用了 @SelectBeforeUpdate,那么不应该映射字段吗? @PreRemove注释工作正常,即使我只使用ID( repository.remove(ID)),我也会得到所述属性。我还尝试过使用 @PostUpdate方法(因为 tenantId不可更新),但它仍然给出空值。我可以在这些事件中执行必要的检查吗,或者有其他解决方案吗(我希望保持服务层干净)。

@PreRemove
public void preRemove() {
    //tenantId is not null
    if (Boolean.FALSE.equals(Objects.equals(tenantId, ThreadLocalStorage.getTenantId())))
        throw new EntityNotFoundException(id.toString(), this.getClass().getSimpleName());
}

@PreUpdate
public void preUpdate() {
    //tenantId is null
    if (Boolean.FALSE.equals(Objects.equals(tenantId, ThreadLocalStorage.getTenantId())))
        throw new EntityNotFoundException(id.toString(), this.getClass().getSimpleName());
}

共有1个答案

慕容越泽
2023-03-14

@PostUpdate侦听器中检查它。如果您无论如何都抛出异常,您将无论如何通过该机制中止事务。

 类似资料:
  • 生命周期事件 There are two module lifecycle events OnModuleInit and OnModuleDestroy. You should use them for all the initialization stuff and avoid to work in the constructor. The constructor should only be

  • 要了解Spring事件是否适合我正在处理的任务,我需要了解它们是如何工作的,它们存储在哪里?因为我可以猜测它们存储在Spring应用程序上下文中,如果应用程序崩溃则会消失,我的猜测正确吗?

  • 在结构体中标注生命周期也和函数的类似: // 一个 `Borrowed` 类型,含有一个指向 `i32` 类型的引用。 // 指向 `i32` 的引用必须比 `Borrowed` 寿命更长。 // (原望:A type `Borrowed` which houses a reference to an // `i32`. The reference to `i32` must outlive `B

  • 注:本文档提供的生命周期指的是 Universal App 的生命周期,它依赖 rax-app 提供的 runApp方法。 App 级生命周期 launch  在 App 启动时触发 使用生命周期 你可以使用 rax-app 提供的 useAppLaunch 来注册 App 级别的生命周期。 示例: import { useAppLaunch } from 'rax-app'; useAppLa

  • 我们大致为WebAPplication设计了4个生命周期: 请求初始化其实就是从URL中解析提取出{module}, {action}, {method}; 然后再根据{module}, {action}, {method}找到对应的Controller文件; 然后再调用对应的{method},完了之后再发送响应。当然响应的过程中肯定是要顺带着解析下模板标签啦。 恩,这就完了,貌似感觉很简单啊。

  • 如下图. 可以看出,基本周期是: created mounted updated (update 可以理解成人肉手动操作触发) destroyed 上面步骤中的 1,3,4都是自动触发。 每个步骤都有对应的 beforeXyz方法 所以, 我们一般使用mounted 作为页面初始化时执行的方法