hibernate - 在长时间运行的对话中在 Wicket 和 Hibernate 之间安全地传递信息

标签 hibernate wicket

我们在后台使用 Wicket 和 Hibernate。

作为 UI 的一部分,在更新的信息写回数据库之前,我们需要进行相当长的运行对话,跨越多个请求。

为了避免分离对象出现 hibernate 错误,我们现在使用值对象将信息从服务层传输到 Wicket。

然而,我们现在最终得到了几乎相同对象的爆炸:

例如

  • 答案(在 hibernate 中保存的映射实体)
  • AnswerVO(不可变值对象)
  • AnswerModel( session 域中的可变 bean)
  • IModel 包裹的 Wicket 模型
  • 通常这会被封装在一个CompoundPropertyModel中

当对象中涉及到其他对象的集合时,这种管道会变得指数级恶化。

必须有更好的方法来组织这个。

有人可以分享一些技巧来减轻这件事的繁重吗?

也许可以使值对象可变,这样我们就可以消除 Wicket 中对单独支持 bean 的需要?

使用实体 bean,但绝对确定它们与 hibernate 状态分离。 (说起来容易做起来难)?

还有其他技巧或模式吗?

最佳答案

使用OpenSessionInViewFilter从 Spring 开始。这将帮助您为每个请求创建一个 hibernate session 。但是,它仅打开一个只读 session 。要对实体 bean 执行任何写入操作,我建议启动一个 hibernate 事务(您可以使用 Spring 中的 TransactionTemplate 来实现此目的)。还有其他方法可以执行写入操作,但我发现这对我来说最简单。

现在,为了清理你的 bean ,这就是我倾向于做的事情

  1. 只有实体 Bean
  2. 如果您想实现无状态,只需将实体 Bean 的 key 保存到 session 中,并在多请求 session 中的每个请求上重新加载 Bean
  3. 保持状态是有一点技巧的。在将 Bean 持久保存到 session 存储中之前,您需要分离实体 Bean,并且在执行后续请求时需要将其重新附加回来。当然,如果有人在后台更新了实体,您将必须在应用程序中处理它(即通知用户“数据库已被外部修改等”)。

我会选择上面的(2),因为它非常简单并且适用于大多数情况。当您的持久 bean 被两个单独的 session 修改时,不建议这样做,因为您最终会覆盖以前的更新。

Hibernate 确实有 some documentation on dealing with detached objects .

关于hibernate - 在长时间运行的对话中在 Wicket 和 Hibernate 之间安全地传递信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2919984/

相关文章:

java - 将 Wicket 与 Wordpress 结合使用

java - 我们如何使用 JPA 计算最后一页?

hibernate - JPA中@Table注解有什么用?

java - 如何设置 Web 应用程序以在 JAVA 中使用 ADFS/SAML/WS-*?

java - 按回车键提交表单

刷新整个页面 Wicket 口

spring - hibernate 5 和 spring - 使用 SchemaExport 生成 ddl

java - 当多个用户使用系统时依赖注入(inject)冲突

java - hibernate 异常: Illegal attempt to dereference a collection

javascript - apache wicket 加载资源 - 错误 403(禁止访问)