2010-09-21 16 views
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如何在JPA和EJB3中使用JDBC ClientInfo

我們需要在EJB3項目中做類似的事情。怎麼樣?

我們可以在EJB服務調用周圍使用EJB3攔截器來捕獲當前用戶並將其設置爲數據源上的信息。但是,我看到了這個問題。我認爲在發生JPA flush()時有沒有保證。如果在攔截器中設置客戶端信息,進行一些更新,然後返回,直到bean(和攔截器)超出範圍之後,flush()和實際的數據庫寫入纔可能發生。它是否正確?

我相信JPA和EntityManagers是對連接的抽象,並且您無法可靠地在連接上設置客戶端信息。對或錯?

+0

解決方案(如果可能的話)可能取決於你的應用服務器和JPA提供商上。你在用什麼? – 2010-09-21 11:26:06

+0

Weblogic 10.3.3。我相信你是對的,它確實依賴於此。我們現在最好的解決方案依賴於ThreadLocals,並且似乎可行,但線程完全超出了EJB規範的範圍。 – 2010-09-21 11:57:27

回答

3

您使用的是JPA提供程序?

EclipseLink支持基於用戶的連接,Oracle代理連接和VPD。 EclipseLink還定義了會話和連接級別事件,這些事件允許您在JDBC連接上設置配置。

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

+0

我們使用Oracle的Kodo JPA和WebLogic 10.3.3。 – 2010-09-22 05:56:38