0

我有以下模型:

Foo实体和之间的多对多Bar。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();
}

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

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

4

1 回答 1

1

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

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

但原则上,有 3 种模式

每个请求的会话

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

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

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

每会话会话

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

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

于 2020-01-07T13:28:27.563 回答