繁体   English   中英

Hibernate实体存储为HttpSession属性值

Hibernate entities stored as HttpSession attribute values

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在处理具有大型,相当混乱的代码库的旧版Java应用程序。 在请求之间有一个相当标准的“用户”对象存储在HttpSession中,因此servlet在顶部执行以下操作:

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

旧的用户身份验证层(我将不进行描述;可以说,它没有使用数据库)已被Hibernate映射到数据库的代码取代。 因此,“用户”现在是一个休眠实体。

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

3 个回复

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

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

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

通过尝试将HttpSession中的User对象合并到您的hibernate会话中,您基本上是在尝试直接操纵hibernate的IdentityMap,用任何其他东西替换所有应该存在的hibernate“思想”,并且可以理解,这可能会引起问题。 正如我所说,尽管可以将分离的对象附加到休眠会话中,但我会避免这样做。 无论采取哪种方法都祝您好运。

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

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

使用session.merge(..)

(来自Session的文档):

通过调用merge(),也可以使临时实例或分离实例的状态作为新的持久实例持久化。

只要确保正确覆盖hashCode()equals()

取决于用户在会话期间是否发生更改,或者仅想通过ID,名称等进行快速查找。 您始终可以从数据库中合并()用户以使其再次进入会话。

您不需要每次都合并用户,因为它并不是您一直需要的数据库命中。 但是通过合并,您可以将用户重新连接到当前会话。

2 HttpSession属性:为什么不更新该属性

我正在使用会话和servlet进行一些练习。 我已经创建了一个servlet对其进行测试,并且具有下一个“ doGet”方法: 我想知道的是我需要线吗 更新会话上“ timesVisited”属性的值。 如果我注释该行,则每次调用servlet时该值将始终为1。 我期待的是 ...

4 是否将null存储为实体属性的值?

由于实体存储在存储空值时会被淘汰,因此我设法获得一个“ hack”来将空值保存到其中。 但是我不确定我的方法是否徒劳。 这是一个片段: 这里的第一个问题是,一次又一次地registerCustomPropertyType CustomCustomPropertyType是否安全, ...

5 将HttpServletRequst存储在HttpSession中

我想将HttpServletRequest对象存储在HttpSession作为属性。 这是我在另一个servlet中取回它的方法, 当我在if语句中检查它时,这里的rq不是nul。 我的问题是,当我尝试获取请求对象中的参数时,将引发空点异常。 如何重新存储参数,如何存储请求? ...

6 具有默认属性的HttpSession

您好,我正在开发Spring Web应用程序。 我想知道是否可以使用默认属性启动/创建/实例化HttpSession: 用户登录后,我会将值更改为true 有可能还是应该改变我的观点? 提前致谢 ...

7 使用 Hibernate 的 OneToOne 映射存储实体

我有以下两个实体: 人.java: 地址.java: 我想将这两个实体映射到以下架构: 请注意,地址表没有主键,只有个人表上的外键。 这意味着一个地址不能在没有与之关联的人的情况下存在,并且映射必须是一对一的。 不幸的是,Hibernate 注释不能正常工作。 这是我用来测试上述代码 ...

8 hibernate / jpa如何存储一个实体之间的关系

我想将分层文件夹存储在数据库中。 铁 因此,如果Folder位于子文件夹中,则他应该存储有关parentFolder的信息。如果Folder位于根目录/顶层文件夹中,则它没有任何parentFolder,因此将为null 我应该如何使用注释设置休眠状态以实现此目的? 我的实 ...

10 将值附加到实体的属性Azure表存储

我想使用Azure的PHP SDK将值附加到Azure表存储中的现有属性。 例如: PartitionKey: PartitionValue | RowKey: RowValue | PropertyValue -> Value1 我想像这样将Value2附加到Value1 ...

2016-09-30 04:23:59 1 105   php/ azure
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM