2012-04-03 61 views
1

我是JPA和JBoss的新手,很抱歉如果這是一個愚蠢的問題。在運行時使用在JBoss上運行的EclipseLink修改JPA模式

我使用EclipseLink在JBoss上運行應用程序,該應用程序基於JPQL字符串從各種數據庫中檢索實體。這很好,除了一個數據庫包含多個模式。我希望能夠在運行時指定要使用哪個模式,並選擇屬於該模式的所有實體,而無需修改JPQL字符串。

爲了進一步複雜化,我還希望在同一個查詢中跨架構加入。在這種情況下,JPQL查詢可能會更改,或者可以設置指定每個實體模式的參數。

經過一番搜索,我碰到這樣的:

JPA: How do I specify the table name corresponding to a class at runtime?

其中有使用ASM動態修改表標註的解決方案。我試圖用它來修改Table註釋的模式屬性,但對於我來說,我無法讓它工作; Eclipse Link似乎使用不同的類加載器來初始化我不知道如何訪問的實體類,因此更改註釋不起作用。

另一種解決方案是每個模式都有多個xml配置文件。它似乎不雅;當我添加一個新實體時,我必須記住將它添加到每個模式的xml文件中。我也不知道如何跨多個模式進行這種連接。

有什麼辦法可以解決這個問題嗎?我是否錯過了某些東西,或者這是否推動JPA超出預期目標?

回答

3

您應該爲每個模式有不同的持久性單元。你可以使用相同的類/映射,你只需要一個orm.xml文件來定義不同的默認模式。該文件不需要其他任何東西,您仍然可以在註釋中或在單獨的orm.xml文件中映射對象。

要在一個模式中擁有一個對象的持久性單元,並且在另一個模式中有一些對象,您可以再次在orm.xml文件中執行此操作。您只需要在orm.xml文件中包含使用非默認模式的實體。 EclipseLink總是將註釋和XML合併在一起,因此您可以在xml中使用兩者並只添加所需的添加項。

EclipseLink還允許您設置一個定義默認模式的tableQualifier。這可以使用會話登錄中的SessionCutsomizer進行設置。

+0

這意味着我必須爲每個獨特的模式組合在新的持久性單元中定義一個新的orm.xml文件,對嗎?我希望避免這種情況,因爲它會導致很多持久性單元和orm.xml文件。 – user1309663 2012-04-04 06:18:18

+1

是否有可能以某種方式獲取對當前會話定製器的引用或在運行時更改表限定符?例如:'DatabaseLogin login = server.getLogin();' 'login.setTableQualifier(「MySchema」);' 'session = server.acquireClientSession(login);'這不起作用。 – user1309663 2012-04-04 08:44:51

+0

在併發/共享系統中更改共享配置從來就不是一個好主意。如果你有一個不同的數據庫用戶默認每個不同的模式,那麼當創建一個emf時,你只需要在pu屬性中傳遞用戶名。 – James 2012-04-04 14:17:14