Java 支持无状态和有状态用法的JPA代码

Java 支持无状态和有状态用法的JPA代码,java,dependency-injection,software-design,Java,Dependency Injection,Software Design,我有两个共享一个数据库的应用程序。一个应用程序处理来自队列的消息,另一个应用程序具有支持队列使用的完全相同的函数(加上许多其他函数)的JSF屏幕。JPA代码中有相当多的重叠,因此我希望为两个应用程序创建一个可重用的模块(正如我在更改JPA查询时必须将其应用于两个应用程序一样) 现在,我们在数据库的每一行都附加了一个用户id。当响应队列消息创建行时,用户id是静态的“SYSTEM_X_id”(例如)。但是当用户通过JSF屏幕创建行时,它将是会话中的用户id 这就是我的问题所在-应用程序的队列版本没

我有两个共享一个数据库的应用程序。一个应用程序处理来自队列的消息,另一个应用程序具有支持队列使用的完全相同的函数(加上许多其他函数)的JSF屏幕。JPA代码中有相当多的重叠,因此我希望为两个应用程序创建一个可重用的模块(正如我在更改JPA查询时必须将其应用于两个应用程序一样)

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

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

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

提前感谢。

(假设会话指的是HttpSession)

依赖关系应该只走一条路。让数据访问层依赖于特定于web层的东西似乎是一件坏事。这是一件坏事,因为它限制了你试图实现的再利用

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

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

(假设会话指的是HttpSession)

依赖关系应该只走一条路。让数据访问层依赖于特定于web层的东西似乎是一件坏事。这是一件坏事,因为它限制了你试图实现的再利用

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


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

我试图避免在对数据库的每次调用中都添加一个参数。。。没有其他方法吗?@BigMac66:参数是最简单的方法。您可以使用ThreadLocal,但因为它应该是一个可重用的库,看起来很棘手,而且很模糊。它还假设dao调用将与调用应用程序位于同一线程中-|感谢您迄今为止的帮助-我又想到了一个想法:在JTA事务中放置变量是可能的吗?我对JTA不太熟悉,所以这可能是一个愚蠢的问题。。。在我工作的地方,我们也需要使用容器管理的事务。我试图避免在对数据库的每次调用中添加参数。。。没有其他方法吗?@BigMac66:参数是最简单的方法。您可以使用ThreadLocal,但因为它应该是一个可重用的库,看起来很棘手,而且很模糊。它还假设dao调用将与调用应用程序位于同一线程中-|感谢您迄今为止的帮助-我又想到了一个想法:在JTA事务中放置变量是可能的吗?我对JTA不太熟悉,所以这可能是一个愚蠢的问题。。。在我工作的地方,我们也需要使用容器管理的事务。