范围类型如何影响 EntityQuery 对象的重用方式

2024-03-23

for (...) {
    UserList userList = (UserList) Component.getInstance(UserList.class, ScopeType.METHOD);
    userList.getUserByEmailAddress(emailId);
}

Seam 支持不同的 ScopeType(例如 METHOD、PAGE、EVENT、APPLICATION)。我们当前使用 METHOD 范围通过电子邮件 ID 检索用户对象。上面的代码存在于 for 循环中(即,对于用户电子邮件地址的集合,我们检索用户对象)。这是正确的 ScopeType 还是最好将 UserList 声明移至 for 循环上方

我们观察到在某些范围类型中 userList 对象被重用,有人可以澄清它的真正工作原理吗? Seam 中是否有任何工具可以帮助您了解如何重用这些对象(我们打开了一些跟踪日志记录,但正在进行的调用太多,而且不太清楚)


ScopeType.METHOD 说

每次调用会话 Bean 或 JavaBean 组件将新的方法上下文放入与当前线程关联的方法上下文堆栈中。当方法返回时,上下文被破坏。

Seam 的大部分功能都是作为一组内置 Seam 拦截器实现的。这是 API 所说的 MethodContextInterceptor (内置 Seam 拦截器)的一段代码

设置 METHOD 上下文并在通话期间取消 SFSB 的代理

MethodContextInterceptor.java 请参阅下面的注释并与上面突出显示的文本进行比较

@AroundInvoke
public Object aroundInvoke(InvocationContext ctx) throws Exception {
    Component comp = getComponent();

    String name = comp.getName();
    Object target = ctx.getTarget();
    Method method = ctx.getMethod();
    Object[] parameters = ctx.getParameters();

    /**
      * beginMethod
      *
      * Takes care of putting a NEW method context onto the stack of method contexts
      */
    Context outerMethodContext = Lifecycle.beginMethod();

    try {
        Contexts.getMethodContext().set(name, target);
        Contexts.getMethodContext().set("org.jboss.seam.this", target);
        Contexts.getMethodContext().set("org.jboss.seam.method", method);
        Contexts.getMethodContext().set("org.jboss.seam.parameters", parameters);
        Contexts.getMethodContext().set("org.jboss.seam.component", comp);

        /**
          * And after method return 
          */ 
        return ctx.proceed();
    } finally {
        /**
          * endMethod Takes care of destroying The previous added method context
          */       
        Lifecycle.endMethod(outerMethodContext);
    }
}

正如您所看到的,我没有看到 ScopeType.METHOD 提供的任何特殊行为。我认为 Seam 项目的创始人 Gavin King 创建了 ScopeType.METHOD 作为可以在以后使用的附加范围。即使 Seam in Action 一书也不涵盖 ScopeType.METHOD 范围。

所以每次你打电话的时候通过电子邮件地址获取用户,执行上面的例程。关于上下文,Seam in Action 书很清楚

上下文定义了可以找到变量名的位置以及它存在多久

因此,您所需的范围应该符合您的业务需求。

关于实体查询???这是 Seam in Action 书中所说的内容

如果执行查询每次你需要展示结果时,你都可以撤消pressure在数据库上。在另一个极端,如果你保留结果太久,你最终会向用户提供stale信息这可能会让他们感到困惑,或更糟糕的是,导致他们做出错误的决定。

默认情况下,某些 Query 方法会避免冗余的数据库查询通过将结果缓存在私有财产中在课堂上。但它可以被覆盖,因为你改变了

  • 查询限制参数
  • 排序顺序
  • 最大结果值
  • 第一个结果偏移量
  • 通过调用refresh()手动清除结果

当您更新某些 @Entity 并且需要刷新存储的结果集时,最后一项很有用。您可以通过使用 Seam 事件来完成它。但如果你总是想要一个新的结果集,将 EntityQuery 设置为 ScopeType.EVENT 并在 for 循环之前使用它

UserList userList = (UserList) Component.getInstance(UserList.class, ScopeType.EVENT);
for (...) {
    userList.getUserByEmailAddress(emailId);
}

这是 Seam 和 Spring 范围之间的并排比较

Seam                               Spring            Suited for
ScopeType.STATELESS                singleton         Service, repositories, Thread-safe components
ScopeType.APPLICATION              singleton         Service, repositories, Thread-safe components
ScopeType.SESSION                  session           User login
ScopeType.CONVERSATION             -                 Page flow
ScopeType.PAGE                     -                 Server-side based component model
ScopeType.EVENT                    request           Non Thread-safe components

注意 ScopeType.CONVERSATION 不等于 Spring web flow。 Seam ScopeType.CONVERSATION 超越了 Web 层。甚至持久性上下文也可以包含在对话上下文中。请记住,当您拥有基于服务器端的组件模型框架(例如 JSF、Wicket 等)时,ScopeType.PAGE 才有意义。通常,当您拥有完全 Java EE 环境时,将使用 ScopeType.STATELESS,而当您拥有完全 Java EE 环境时,将使用 ScopeType.APPLICATION。您使用普通 POJO 而不是 EJB。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

范围类型如何影响 EntityQuery 对象的重用方式 的相关文章

随机推荐

  • Go:JSON 封送错误

    我正在 Go 中构建 JSON API 我想以 json 形式返回错误响应 响应示例 error Invalid request syntax 我认为我可以创建一个实现错误接口的包装结构 然后使用 Go 的 json 封送拆收器作为获取错误
  • Express 和 Redis 会话的过期时间

    我正在使用express和redis来使会话在我的系统上保持活动状态 我在设置 sessionCookie 上的 maxAge 时遇到一些问题 默认情况下 我读到的时间是 24 小时 但这对于保持其存活来说是很长的时间 我想设置大约 30
  • WordPress 按标题中的最后一个单词排序

    我有一个自定义帖子类型 员工 我需要让它在页面上按姓氏字母顺序显示员工 我知道解决方法是使用自定义元框并将名字和姓氏分成两个字段 但我试图避免这种情况 因为这看起来很黑客 不像仅使用标题字段那么干净 我有一个短代码 它将显示带有请求的员工
  • 使用 CSplitterWnd 在 CChildFrame 中创建多个视图

    我正在使用 MFC MDI 我需要创建如下视图 我的 ChildWnd 分为两部分 它们是LeftView CView 和RightView CScrollView LeftView 分为两部分 TreeView 和 FormView 我怎
  • Asp .NET 按钮 - OnClientClick="return function()" 与 OnClientClick="function()"

    在 asp net 用户控件中 我有一个按钮
  • 如何获取德威远程的 URL

    我希望能够获得像这样的 URLhttps github com user repo git给定一个远程名称 例如origin 到目前为止 我只设法获取提交哈希 gt gt gt from dulwich import porcelain g
  • 在 Python 中临时更改变量的值

    Python 3 4 提供了这个简洁的工具来临时重定向 stdout From https docs python org 3 4 library contextlib html contextlib redirect stdout wit
  • 通过 Rest c# httpClient 创建 jira 问题

    我读过 atlassian 上的一个答案https answers atlassian com questions 79902 using httpclient c to create a jira issue via rest gener
  • C# - 为什么在实现 IEnumerable 接口时要实现两个版本的 Current?

    我假设以下示例提供了我们在实现 IEnumerable 接口时应遵循的最佳实践 https learn microsoft com en us dotnet api system collections ienumerator movene
  • Plon 和 Asp.Net 集成

    How to 制作一个 Asp Net 应用程序来识别经过身份验证的克隆用户 他 她的 ID 角色和任何其他可用数据 反之亦然 在我的 asp net 应用程序中显示 plone 内容或在 plone 中显示一些特定于应用程序的数据 从 A
  • ColdFusion:在 CFC 中省略变量关键字是否安全?

    在 ColdFusion 组件 CFC 中 是否有必要对变量范围的变量使用完全限定名称 如果我改变这个 我会给自己带来麻烦吗
  • 如何在 TypeScript 中迭代通用对象的键?

    我需要迭代一个仅键入为 对象 的大对象 它包含未知数量的相同类型的对象 在较早的帖子中 我找到了在自定义 Symbol iterator 函数中使用生成器来使大对象可通过 for of 循环进行迭代的解决方案 但在我看来 现在已经是 201
  • numpy `arange` 超过最终值

    我原以为 numpy 的arange start end 生成 start end 范围内的值 下面的示例表明这并不总是正确的 最终值大于end import numpy as np start 2e9 end start 321 step
  • 导入文件时如何跳过第一行

    我正在尝试导入一个 xlsx文件输入Laravel5 7版本使用Maatwebsite excel版本 3 1 我想要实现的是跳过文件的第一行 以避免在数据库中导入列标题 我尝试使用版本 2 语法 调用skip method public
  • 强制从 US-ASCII 编码为 UTF-8 (iconv)

    我正在尝试将一堆文件从 US ASCII 转码为 UTF 8 为此 我使用 iconv iconv f US ASCII t UTF 8 file php gt file utf8 php 我的原始文件是 US ASCII 编码的 这使得转
  • WiX:旧版本不会在“添加/删除程序”列表中消失

    我有一个使用 WiX 安装和升级的 Windows 服务 效果很好 非常快 唯一的问题是 如果我从 1 0 升级到 1 1 两个副本在 添加 删除程序 列表中仍然有条目 那么 当我执行更新时 如何确保 WiX 删除 添加 删除程序 列表中旧
  • 使用 Chrome 开发者工具调试 onFocus 事件?断点后无法返回焦点

    我正在尝试调试 JavaScriptonFocus附加到页面上一堆文本框的事件 选择一个文本框然后按 Tab 键切换到下一个文本框时会出现此错误 我试图通过在其中放置一个断点来调试它onFocus使用 Chrome 开发者工具的事件 我面临
  • Prolog 时间重叠问题

    假设我有这个知识库 free ann slot time 8 0 time 9 0 free ann slot time 10 0 time 11 0 free bob slot time 7 0 time 8 30 free bob sl
  • Jenkins Copy Artifact 解析复制的构建 ID

    我在 Jenkins 2 73 1 中使用 在多分支管道中复制神器插件 https wiki jenkins io display JENKINS Copy Artifact Plugin要从其他两个管道获取最后成功的工件 请参阅我的 Je
  • 范围类型如何影响 EntityQuery 对象的重用方式

    for UserList userList UserList Component getInstance UserList class ScopeType METHOD userList getUserByEmailAddress emai