【问题标题】:How to mix persistent and transient state of a domain object?如何混合域对象的持久状态和瞬态状态?
【发布时间】:2011-05-25 07:30:02
【问题描述】:

我正在寻找一种可以彻底解决以下问题的模式/方法:

在屏幕显示应用程序中(各种信息显示在公共场所的 LCD 屏幕上),我有 Hibernate 持久 POJO,可以在我的应用程序的管理部分创建和更新。

在只读的“显示”部分中,我使用了这些对象。它们必须始终与持久状态保持同步,但它们也具有瞬态状态(从未存储在数据库中),其生命周期是整个用户 (HTTP) 会话(可以持续一整天或更长时间) 和特定于每个会话/用户(这里的“用户”是一个屏幕)。

如何(干净地)组合这两种状态以保持内存中的瞬态状态(在 HTTP 会话中),同时定期从数据库刷新持久状态?使用相同的类并在需要时执行 Hibernate session.refresh() ?将两种状态存储在不同的类中并将它们链接起来,例如用身份证?装饰器模式?

【问题讨论】:

    标签: hibernate object persistence


    【解决方案1】:

    不确定我是否理解。如果对象是只读的,什么样的信息是瞬态的?如果对象是只读的,它在所有会话中总是相同的。也许您的意思是该对象不是只读的,但它不会被持久化回服务器?

    【讨论】:

    • 一些字段是持久的,并且在应用程序的这一部分中是只读的。其他一些不是持久的(如此短暂的),而是表示跨越用户会话的(不断变化的)状态,并且对于每个会话都是不同的。我希望它更清楚!
    • 如果“瞬态”字段不是持久的,而是特定于会话,那么您应该考虑使用有状态会话 Bean (EJB)。这样,服务器负责将特定的 SFSB 传递给客户端,并且可以在会话到期(或关闭)时清除它们。这里唯一的“陷阱”是您似乎在同一个实例中拥有这两个信息。我认为这并不理想,因为您可能会混淆关注点。但如果不知道您的问题的具体情况,我不能这么说。
    • 谢谢!但我现在不切换到 EJB :) 我现在的解决方案:将 Hibernate POJO 存储在 HTTP 会话中。这在用户会话中保持“瞬态”状态。然后,当我需要重新读取持久状态时,我会调用 hibernate 的 session.refresh。由于我对每个 HTTP 请求使用不同的休眠会话,因此我可以拥有同一个持久对象的多个实例,因为持久对象仅在休眠会话范围内是唯一的。我会赞成你的回答,但我真的不能接受它对不起......
    猜你喜欢
    • 2020-04-16
    • 2019-12-23
    • 2012-08-06
    • 1970-01-01
    • 2020-03-09
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    相关资源
    最近更新 更多