【问题标题】:JPA code that supports statless and stateful usages支持无状态和有状态用法的 JPA 代码
【发布时间】:2020-02-27 21:10:03
【问题描述】:

我有两个共享数据库的应用程序。一个应用程序处理来自队列的消息,另一个应用程序具有 JSF 屏幕,这些屏幕支持队列使用的完全相同的功能(以及许多其他功能)。 JPA 代码中有相当多的重叠,因此我想为两个应用程序创建一个可重用的模块(因为当我对 JPA 查询进行更改时,我必须将它应用于两个应用程序)。

现在我们在数据库的每一行都附加了一个用户 ID。当为响应队列消息而创建行时,用户 ID 是静态的“SYSTEM_X_ID”(例如)。但是当用户通过 JSF 屏幕创建该行时,它将是会话中的用户 ID。

这就是我的问题所在 - 应用程序的队列版本没有会话。会话对象被注入。那么如何编写可重用的数据库代码来检查是否存在注入的会话对象,该对象将被注入 JSF 应用程序中,但不会注入到队列应用程序中?有没有可能?

到目前为止,我的一个想法是修改所有其他 Dao 类扩展的 BaseDao 类,以便在队列版本中静态分配它而不引用会话对象,而在 JSF 版本中注入会话对象并使用其中的用户ID。我宁愿不必这样做 - 因此我的问题。

提前致谢。

【问题讨论】:

    标签: java dependency-injection software-design


    【解决方案1】:

    (假设会话是指 HttpSession)

    依赖关系应该只有一种方式。让数据访问层依赖于特定于 Web 层的东西似乎是一件坏事。这是一件坏事,因为它限制了你试图实现的重用。

    HttpSession 应该只在 web 层中被引用。通过从 DAO 中删除会话并让 JSF 代码显式传递用户 ID 来摆脱这种依赖关系。

    一旦解决了这个问题,那么您的常见 DAO 应该会接受用户 ID 作为参数,并且不会有任何问题。

    【讨论】:

    • 我试图避免在每次调用数据库时都添加一个参数...有没有其他方法可以做到这一点?
    • @BigMac66:参数是最直接的方式。你可以使用 ThreadLocal,但是因为这应该是一个看起来很棘手和混淆的可重用库。它还假设 dao 调用将与调用应用程序在同一个线程中。 :-|
    • 感谢您迄今为止的帮助 - 我又想到了一个想法:是否可以将变量放入 JTA 事务中?我对 JTA 不是很熟悉,所以这可能是一个愚蠢的问题……在我工作的地方,我们也需要使用容器管理的事务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    相关资源
    最近更新 更多