0

上下文/设置

我们在带有 Spring 和 Hibernate 集成的应用程序中使用 open-session-in-conversation-filter 模式。

我们正在使用 Springs 声明性事务管理,使用org.springframework.transaction.interceptor.TransactionProxyFactoryBean.

当应用程序收到请求时,我们会执行多个数据库活动(插入/更新),其中更新和插入单独刷新到数据库并提交事务。

问题

假设对于其中一个插入/更新,引发了数据库异常,休眠会话按预期关闭,因为会话处于无效状态。

即使在此之后,如果我不想返回请求并希望继续我的请求并完成我无法完成的其他活动,因为会话已关闭并且通过此会话的任何后续调用都失败了,原因很明显。

我需要帮助编写一个解决方案,我可以关闭现有会话并打开一个新会话并将最新会话附加到线程使用TransactionSynchronizationManager但不确定如何执行此操作,因为在很多地方我可能需要在流程中执行此操作,有没有通用的方法来做到这一点?它甚至是正确的设计吗?

即使我实现了这一点,与前一个会话分离的实体如何自动附加到新会话,以便代理无缝工作?

4

1 回答 1

0

我们在带有 Spring 和 Hibernate 集成的应用程序中使用 open-session-in-conversation-filter 模式。

对话模式就像 Java EE 中的扩展持久性上下文一样工作,就像您在此处描述的那样。如果你得到一个例外,你将不得不放弃一切,从头开始。

现在,如果您想要更大的灵活性,您可以只使用分离实体并Session在每个请求中使用一个新的实体,这将合并分离的实体。

但是,如果实体状态总是会导致异常怎么办?您如何确定实体并简单地忽略它?如果它链接到其他实体怎么办。

因此,这个问题没有简单的解决方案。你可以做的是:

  1. 使用从数据库中读取的初始实体捕获初始状态并将其存储在HttpSessionRedis 等中。
  2. 存储用户提交的信息,因此如果您遇到异常,您可以使用与错误消息相同的更改重新渲染 UI。

这样,用户不会丢失他们所做的更改,并且根据错误消息,他们可以在应用更正后重试。

于 2018-04-17T12:48:16.547 回答