1

我们正在将基于 JDBC 的应用程序迁移到 JPA 和 EJB3。我们的旧应用程序使用 Connect#setClientInfo API 将当前用户名记录为客户端信息的一部分:http: //download.oracle.com/javase/6/docs/api/java/sql/Connection.html#setClientInfo% 28java.lang.String,%20java.lang.String%29

我们需要在 EJB3 项目中做类似的事情。如何?

我们可以在 EJB 服务调用周围使用 EJB3 拦截器,以捕获当前用户并将其设置为数据源上的信息。但是,我看到了这个问题。我认为无法保证 JPA flush() 何时发生。如果您在拦截器中设置客户端信息,进行一些更新,然后返回,则可能在您的 bean(和拦截器)超出范围之后很久才会发生 flush() 和实际的数据库写入。这个对吗?

我相信 JPA 和 EntityManagers 是连接的抽象,你不能可靠地设置连接上的客户端信息。对或错?

4

1 回答 1

3

您使用的是哪个 JPA 提供程序?

EclipseLink 支持基于用户的连接、Oracle 代理连接和 VPD。EclipseLink 还定义了允许您在 JDBC 连接上设置配置的会话和连接级别事件。

见, http://wiki.eclipse.org/EclipseLink/Examples/JPA/Auditing

于 2010-09-21T13:26:32.030 回答