2015-09-09 104 views
2

我使用Spring數據JPA在春季啓動給我很好的自動配置,所以我不需要爲每個實體配置EntityManager和數據源。多個數據庫的春天數據JPA應用程序與自動配置

但是,我的應用可能需要連接到兩個不同的數據庫。因此,一些在我的應用程序的實體需要映射到數據庫中,而其他實體需要被映射到不同的數據庫

我已經探討過這個回購 Link

,結果發現,回購配置每個EntityManager和TransactionManager爲每個實體。如果我的應用程序有很多實體,這可能非常耗時。

是否有可能我仍然依靠Spring數據JPA的Spring Boot autoconfig並仍使用兩個不同的數據庫?

回答

4

您只需要每個數據源一個配置,而不是每個實體(每個數據源可以有多個實體)。例如,假設您正在現有數據庫的頂部開發一個系統,其中產品目錄位於一個數據庫中,另一個庫存信息以及訂單信息需要進入完全不同的數據庫。此外,您的(新)應用程序的客戶信息將需要存儲在一個全新的數據庫中,因爲其他數據庫的所有者不允許您觸摸他們。所以,總的來說,你有四個數據庫來處理。

您需要四個數據源配置,一個用於需要處理的四個數據庫。每個配置必須定義:

  1. SQL DataSource提供有關連接到數據庫的信息;
  2. 使用DataSourceEntityManagerFactory;
  3. A TransactionManager執行表示EntityManager可以使用;和
  4. 引用Java程序包,其中EntityManager可以找到映射到DataSource的實體類。

如果數據庫操作是這樣的,他們是在同一時間對只有一個數據庫中執行,則可以使用JpaTransactionManager s的每個配置(這意味着你將需要四個JpaTransactionManager聲明)。但是,如果數據庫操作可能跨越多個數據庫,則可以聲明一個JtaTransactionManager或聲明四個JpaTransactionManager(每個DataSource都一個)並將它們包裝在一個ChainedTransactionManager(總共創建五個事務管理器聲明) 。

由於您的實體類將被綁定到特定的數據源,因此您將需要使用不同的Java包對它們進行分隔。您可以例如org.example.model.catalog,org.example.model.inventory, org.example.model.order, org.example.model.customer

+0

如何將這些'EntityManagerFactory'從Spring Data JPA鏈接到每個存儲庫接口? – IllSc

+0

將LocalContainerEntityManagerFactoryBean的'packagesToScan'屬性設置爲實體管理器應該查找存儲庫接口的值(例如,'org.example.data.customer')。 – manish