2013-03-01 128 views
1

JPA是否支持可選的持久性單元,如果是的話如何配置?JPA中的可選持久性單元(使用多個持久性單元時)

我有一個持久性單元,這是我的主要數據庫。

然後我配置了另一個我剛從數據庫中讀取對象來做一些檢查。爲了避免混淆多個數據源上的事務,我設置了第二個數據源jta="false"

但我希望能夠檢查是否有第二個數據源被定義,只有在它存在時才使用它。如果沒有定義,我想簡單地跳過我的支票。

問題是,我找不到如何使此選項。如果未配置第二數據源我從JBoss中部署掃描器New missing/unsatisfied dependencies錯誤時,我的戰爭部署:

service jboss.naming.context.java.secondDatasource (missing) dependents: [service jboss.persistenceunit."de.my.war#secondDatasource"] 

(順便說一句:我使用JBoss 7.1.0和standard.xml配置的數據源 - 如果該信息與任何相關性)。

任何提示?

回答

3

我不確定這是可能的XML配置,這基本上是如何在大多數情況下使用JPA的約定。嘗試尋找一個編程方法。

也許你可以通過編程的方式將數據源查找爲JNDI資源,如果找到了,你可以自己build an EntityManager。在CDI的幫助下,它可能不會像你想象的那麼困難。

@Produces 
@MyAlterNativeEntityManager 
public EntityManager getEntityManager { 
    EntityManager entityManager = null; 
    if(jndiLookupMySecondDatasource()){ 
     entityManager = buildEntityManagerProgrammatically(...); 
    } 
    return entityManager; 
} 

當然,如果沒有找到數據源,一個空的EntityManager將返回但隨後調用代碼,你可以簡單地檢查它是否被初始化,並且只使用,如果它是。 希望能幫助你把握正確的道路。

+0

感謝您的想法。我認爲這已經發生,當我的'persistence.xml'處理。但是我會檢查這個...... – Jens 2013-03-06 14:46:27

+0

當然,但這樣你甚至不必在persistence.xml中聲明第二個數據源! – 2013-03-06 21:57:11

+0

@BalzásMáriaNémeth:對不起,我遲到了。如果存在通過JNDI發現的'datasource',我嘗試了自己構建'EntityManager'的解決方案。但是:我不知道如何在我自己創建的'EntityManager'上設置找到的'datasource'。 'EntityManagerFactory'。它只接受'屬性'來創建一個。但我手邊有一個'datasouce'。我想過自己映射所有必要的屬性,但密碼是我在'datasource'上找不到的。有沒有辦法讓創建的'EntityManager'使用我的'datasource'? – Jens 2013-03-18 10:10:32

1

在JPA標準:

  • 每個的EntityManagerFactory(EMF)必須涉及一個PersistentUnit(PU) - 不可能有多個PersistenceUnits也不爲零PersistenceUnits。
  • 每個EntityManager(EM)實例都是從EMF創建的,因此也有一個PU。當然,可以從EMF創建多個EM,全部使用相同的PU。
  • 可以配置PU使用硬編碼

    明確地使用其針對每個EMF

    EntityManagerFactory的電動勢= Persistence.createEntityManagerFactory( 「的EmployeeService」);

    或通過注射使用註釋

    @PersistenceUnit( 「的EmployeeService」) EntityManagerFactory的電動勢的電動勢;

    或者可以讓它保持空白,只需選取persistence.xml中配置的默認PU。

  • 可以通過使用註釋注入EM來配置對每個EM顯式使用哪個PU。這裏的代碼根本不涉及EMF(讓容器不可見地引用EMF)

    @PersistenceContext(unitName =「EmployeeService」) EntityManager em;

在所有這些可選PU的想法沒有任何意義。如果您正在使用JPA EM,則必須提交PU。

選項:

  1. 編輯的persistence.xml爲具有兩個不同的物理數據庫實例之間的相同的邏輯持久性單元「開關」。不符合全部要求 - 仍會從替代數據源讀取值。
  2. 根據Balazs Maria Nemeth的解決方案,查找/注入一個環境變量(不管是否「調試」)並以編程方式在不同數據源之間輕彈。不符合全部要求,因爲它仍然會從替代數據源讀取值。
  3. 查找/注入一個環境變量(不管是否爲「調試」)並適當地爲替代EM運行/排除代碼。

3只是滿足全部要求的選項。例如: -

// Inject environment setting. Resource annotation works with/without CDI - 
// just doesn't give scoping support, which isn't required here. 
@Resource boolean debugMode; 

if (debugMode) { 
    @PersistenceContext(unitName="DebugPersistenceUnit") 
    EntityManager debugEM; 

    Employee emp = debugEM.find(Employee.class, empId); 
} 
在web.xml或ejb.xml

然後包括ENV條目:

<env-entry> 
    <description> 
    Only set this true in a debugging environment 
    </description> 
    <env-entry-name>debugMode</env-entry-name> 
    <env-entry-type>java.lang.Boolean</env-entry-type> 
    <env-entry-value>true</env-entry-value> 
</env-entry>