【问题标题】:Is all code run inside an mvc controller method in the same session?所有代码都在同一会话中的 mvc 控制器方法中运行吗?
【发布时间】:2020-01-07 23:23:35
【问题描述】:

我有以下型号:

实体FooBar 之间的多对多。 Foo 有一个 Bar 的 LinkedHashSet,用 @OrderBy 注释。

Controller 包含一个方法,该方法首先将一个新 Bar 保存到集合中,然后从一个 Foo 中获取所有 Bar。

Set<Bar> methodName(FooId fid, Bar b){
    fooService.addBar(fid, b);
    return fooService.getBarsOfFoo(fid);
}

服务方式:

@Transactional
void addBar(UUID fid, Bar b){
    Foo f = fooRepository.getFoo(fid);
    f.getBars().add(b);
}

@Transactional(readOnly = true)
Set<Bar> getBarsOfFoo(UUID fid){
    return fooRepository.getFoo(fid).getBars();
}

问题在于,在调用该方法时,除了最后一个引入的 Bar 之外,所有的 Bar 都是有序的。我认为它与休眠一级缓存有关,但我不确定与该方法关联的会话何时开始或结束。

来自该控制器方法的两个会话方法是否在同一个会话中运行?

【问题讨论】:

  • 请出示addBar和getBarsOfFoo的代码

标签: java spring hibernate session first-level-cache


【解决方案1】:

Hibernate 会话与官方文档 https://developer.jboss.org/wiki/SessionsAndTransactions 中的 MVC 控制器会话不同

这取决于您的配置以及您创建此会话的人员和方式

但原则上,有3种模式

每个请求的会话

每个请求的会话实现模式。一个会话和一个 单个数据库事务实现特定的处理 请求事件(例如,Web 应用程序中的 Http 请求)。做 永远不要使用 session-per-operation 反模式! (有极 当每个操作的会话可能是合适的时,罕见的例外,你 如果你只是学习 Hibernate,不会遇到这些。)

每个请求的会话与分离对象

一旦持久对象在用户思考期间被认为是分离的 并且必须在它们被重新附加到新会话后 修改。

每会话会话

在这种情况下,单个 Session 的作用域大于单个 数据库事务,它可能跨越多个数据库事务。 每个请求事件都在单个数据库事务中处理,但 会话的刷新将延迟到结束 对话和最后一个数据库事务,使 对话原子。会话保持在断开状态,与 在用户思考期间没有打开的数据库连接。休眠的 自动乐观并发控制(带版本控制)用于 提供对话隔离。

因此查看文档,您可能会使用 session-per-conversation,因此可能需要在下次通话之前刷新会话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 2021-07-26
    • 2021-12-14
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    相关资源
    最近更新 更多