Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JPA和EJB3中使用JDBCClientInfo_Java_Jpa_Ejb 3.0_Entitymanager - Fatal编程技术网

Java 如何在JPA和EJB3中使用JDBCClientInfo

Java 如何在JPA和EJB3中使用JDBCClientInfo,java,jpa,ejb-3.0,entitymanager,Java,Jpa,Ejb 3.0,Entitymanager,我们正在将基于JDBC的应用程序迁移到JPA和EJB3。我们的旧应用程序使用Connect#setClientInfo API将当前用户名记录为客户端信息的一部分: 我们需要在EJB3项目中做类似的事情。怎么做 我们可以在EJB服务调用周围使用EJB3拦截器来捕获当前用户并将其设置为数据源上的信息。然而,我看到了这方面的问题。我认为无法保证JPA flush()何时发生。如果在拦截器中设置客户机信息,进行一些更新,然后返回,那么直到bean(和拦截器)超出范围之后,flush()和实际的数据库

我们正在将基于JDBC的应用程序迁移到JPA和EJB3。我们的旧应用程序使用Connect#setClientInfo API将当前用户名记录为客户端信息的一部分:

我们需要在EJB3项目中做类似的事情。怎么做

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


我相信JPA和EntityManager是对连接的抽象,您无法在连接上可靠地设置客户端信息。对还是错

您使用的是什么JPA提供商

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

看,,

解决方案(如果可能)可能取决于您的应用程序服务器和JPA提供商。你在用什么?Weblogic 10.3.3。我相信你是对的,它确实依赖于此。我们目前最好的解决方案依赖于ThreadLocals,而且似乎可以工作,但线程完全不在EJB规范的范围内。我们将Oracle的Kodo JPA与WebLogic 10.3.3一起使用。