作为 HttpSession 属性值存储的 Hibernate 实体

2024-01-25

我正在处理一个遗留的 Java 应用程序,它有一个庞大且相当混乱的代码库。有一个相当标准的“用户”对象,在请求之间存储在 HttpSession 中,因此 servlet 在顶部执行类似的操作:

HttpSession session = request.getSession(true);
User user = (User)session.getAttribute("User");

旧的用户身份验证层(我不会描述;只需说,它没有使用数据库)正在被使用 Hibernate 映射到数据库的代码所取代。所以“用户”现在是一个 Hibernate 实体。

我对 Hibernate 对象生命周期的理解有点模糊,但似乎在 HttpSession 中存储“User”现在成为一个问题,因为它将在下一个请求期间在不同的事务中检索。在这里做什么是正确的?我可以在下次使用 Hibernate Session 对象的 update() 方法重新附加 User 实例吗?我需要吗?


假设您正在为每个请求-响应周期创建一个新的休眠会话,则可以将分离的对象合并到新的休眠会话中,但我会完全避免这种方法。

相反,尝试在 HttpSession 上存储一个密钥,该密钥可用于通过 hibernate 查找每个传入请求的用户。如果您担心访问数据库以检索可存储在 HttpSession 中的内容的性能后果,请不要担心 - 您始终可以使用 hibernate 支持的缓存框架来减少数据库访问次数。提高性能的另一种方法是使用乐观锁定。

虽然我没有看过 hibernate 源代码,但我认为 hibernate 使用“身份映射”模式。这是一个Map,它使用实体的id作为Map中的键,并将关联的实体对象作为Map中的值。每当从 hibernate 会话中检索实体时,hibernate 都会查看会话的身份映射以查看它是否存在。如果存在,它将返回地图中的实体。如果不存在,它将从数据库中检索实体并将其放在地图上,然后返回该实体。这意味着对于给定的 hibernate 会话,使用相同键(即 id、userId 等)访问给定 User 的连续查询将收到对同一 User 对象的引用,因此每个查询将能够“查看”对其他查询的 User 对象。因此,绝对有必要为每个传入请求创建一个新的休眠会话,以便给定用户的并发请求不必将其各自的线程锁定在其公共用户对象上。不同的 hibernate 会话都有自己的身份映射,因此不会返回对同一 User 对象的引用。

通过尝试将 HttpSession 中的 User 对象合并到 hibernate 会话中,您基本上是在尝试直接操作 hibernate 的 IdentityMap,用其他东西替换 hibernate“认为”应该存在的任何内容,可以理解,这可能会导致问题。正如我所说,尽管可以将分离的对象附加回休眠会话,但我会避免这样做。无论您采取什么方法,祝您好运。

我强烈建议您阅读以下内容,特别是有关长时间对话和独立对象的部分:

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/transactions.html http://docs.jboss.org/hibernate/core/3.3/reference/en/html/transactions.html

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

作为 HttpSession 属性值存储的 Hibernate 实体 的相关文章

随机推荐

  • UITextField,1个字符后自动移至下一个

    场景 我有 4 个 UITextField 仅接受 1 个字符 简单的 问题 输入 1 个字符后 我希望下一个 TextField 自动变为活动状态 而不必按下一个 即我正在使用 UIKeyboardTypeNumberPad 并且没有 N
  • 如何将 python 中的目标代码转换为 kotlin?

    我正在开发一个将使用分水岭的图像分割应用程序 为此 我找到了一个需要在 python 中使用的代码 但是 我很难转换为 kotlin 因为 Mat Mat 没有 Zero likes 函数 只有 Zero 函数 我使用的是opencv 3
  • MongoDB shell:如何搜索与名称或正则表达式匹配的集合

    当我使用 show collections 时 它返回一个相当长的所有集合的列表 如何编写查询来返回与模式匹配的集合 我希望有像 db collections name pattern 这样的东西 但找不到 您可以使用db getColle
  • 在 C++ 中释放指针两次或更多次时会发生什么?

    int main Employee e new Employee delete e delete e delete e return 0 You get 未定义的行为如果你尝试delete一个对象多次通过指针 这意味着几乎任何事情都可能发生
  • 如果我想要抓取的图像受 cloudflare 保护并给出 1020 错误,有没有办法使用 Cheerio 抓取网站?

    我正在尝试创建一个漫画抓取网站作为个人项目 就在我完成整个网站时 我知道图像无法被我的网站抓取或查看 当我尝试转到图像的链接时 我收到 1020 错误 指出访问被拒绝 有什么方法可以绕过该错误 而无需从网站所有者那里获取授权令牌 如果答案是
  • 如果子div为空,jQuery隐藏父div

    我环顾四周 发现了很多与此相关的问题 但没有一个解决方案适合我 我有这样的结构 div class pricetag div class price 400 div div div class pricetag div class pric
  • 将 CGImageRef 保存为 PNG 文件时出错? (电弧引起的?)

    这段代码曾经可以工作 但是我认为 Xcode 的新 ARC 可能已经杀死了它 void applicationDidFinishLaunching NSNotification aNotification CGDirectDisplayID
  • 如何知道任务是否同步完成?

    我依稀记得有一个属性可以告诉我们任务是否同步执行 但我刚才记不清了 或者可能没有 我正在混淆IAsyncResult CompletedSynchronously和这个 检查一下 Task IAsyncResult CompletedSyn
  • 全屏、沉浸模式、禁用向左滑动导航栏

    是否可以在全屏沉浸模式下禁用打开主导航栏的向左滑动手势 使其只能从顶部滑动打开 在开发全屏游戏时 必须进行大量设计以防止用户意外打开它 这非常烦人 提前致谢 EDIT 抱歉 只是为了澄清一下 我正在谈论沉浸式模式下的水平锁定全屏游戏 禁用使
  • Python Pandas:如何从列表列创建二进制矩阵?

    我有一个 Python Pandas DataFrame 如下所示 1 0 a b 1 c 2 d 3 e a b是表示用户特征列表的字符串 如何将其转换为用户特征的二进制矩阵 如下所示 a b c d e 0 1 1 0 0 0 1 0
  • 在动态有向图中寻找最小循环路径

    我最近遇到这 编辑 问题A http www scribd com doc 109453858 2 Spotify Codequest 2012今年早些时候 Spotify 的黑客挑战赛中出现了一个有趣的问题 该挑战涉及确定火车卡车路口的切
  • 以低级方式修改或删除文本文件中的一行?

    我正在 Delphi 中使用文本文件 并且我不希望使用加载 保存字符串列表的方法 我打算维护一个开放的文件流 在其中读取和写入数据 将大量数据保存在硬盘上而不是内存中 我有一个简单的概念 即向文本文件写入新行并读取它们 但是当涉及到修改和删
  • 声明一个变量并在编译时将其添加到数组中

    我想要一个 或几个 C 宏 它可以用于两个目的 声明一个 const 变量 将该变量添加到数组中 即 如果我有这个 typedef struct int port int pin pin t 像这样的宏 define DEFINE PIN
  • AngularJS:注入控制器时工厂始终未定义

    我正在尝试使用 AddressBook Angular 应用程序的简单示例 我有一个返回记录数组的工厂 它使用列表控制器显示在列表视图中 angular module abModule ngRoute factory AddressBook
  • Byebug gem 配置问题

    我是 Rails 调试的新手 我在用Byebug gem to debug控制器 我在控制器中的某个时刻保留了 Byebug 关键字 并且执行正在停止 我可以在终端上看到相同的内容并对其进行处理 当我做 next 它正在移动到下一行并检查值
  • 选择与 data.table 的正确连接

    后续行动来自这个问题 https stackoverflow com q 51087287 2204410 我有三个数据表 实际的input一个更大并且性能很重要 所以我必须使用数据表 questions tagged data table
  • JavaFx 端口 TextField 问题 - Android 键盘无法运行

    我开发了一个简单的 javafx 应用程序以移植到 Android 环境中 但是我无法在 TextField 中键入任何字符 我猜这是一个错误 如何解决这个问题 Galaxy S5 android 5 0 1 上不存在此问题 但在 Gala
  • ASP.NET MVC 5 表单验证和错误处理

    尝试在简单的联系表单上实现数据验证和错误处理 当我添加支票时ModelState IsValid我现在处于先有鸡还是先有蛋的境地 我看过其他类似的问题 但我只是不明白 从 Web 表单迁移到 MVC 并陷入困境 尝试根据发生的情况 成功 错
  • brew cask 安装 kdiff3 失败

    brew cask install kdiff3 Error Cask kdiff3 is unavailable No Cask with this name exists brew install kdiff3 Error No ava
  • 作为 HttpSession 属性值存储的 Hibernate 实体

    我正在处理一个遗留的 Java 应用程序 它有一个庞大且相当混乱的代码库 有一个相当标准的 用户 对象 在请求之间存储在 HttpSession 中 因此 servlet 在顶部执行类似的操作 HttpSession session req