2014-09-25 68 views
1

我必須按照下列方式修改現有應用程序的設計,春天JPA +動態切換數據源模式之間的PostgreSQL

enter image description here

根據上述設計每個項目都包含它自己的模式和映射表(project_schema_table)在主模式下。所有模式都在一個Postgresql數據庫下,未來用戶將爲他們的新項目創建另一個新模式(按需)。

在顯示登錄窗口之前,我必須列出所有現有的項目,並且一旦用戶選擇了他的項目,我必須使用相關模式指向該項目。除主模式以外,所有其他項目基本模式都完全相同。

這是一個使用最新版Java技術JavaFX,Spring和JPA與Postgresql數據庫開發的桌面應用程序。目前它只有一個項目相關模式,我必須介紹主模式和所有其他後續項目基礎模式。

我找到類似stack overflow post但它沒有包含任何解決方案。我是否可以用Spring AbstractRoutingDataSource來完成這個任務?或者是否有其他機制。謝謝。

+0

在Spring JPA下面使用的ORM是什麼?休眠? – shazin 2014-09-25 07:32:43

+0

EntityManagerFactory使用Hibernate作爲持久性提供者。我在Spring-data-jpa版本1.4.2.RELEASE中使用Spring JPA存儲庫功能。謝謝。 – Channa 2014-09-25 07:55:54

回答

-1

請參閱Spring的AbstractRoutingDataSource,它應該解決您的問題。 http://spring.io/blog/2007/01/23/dynamic-datasource-routing/

+0

嗨Varun。感謝您的反饋。是的,我已經引用了關於不同數據庫的文章,而不是針對同一數據庫上的模式。此外,我無法將所有數據源配置爲這種方式,因爲模式的數量變爲動態並且必須從另一個表中進行查詢。謝謝。 – Channa 2014-09-25 07:01:14

+0

好吧,我明白你的意思了。我想你需要在定義實體時提供schemaname.tablename,所以這是編譯時應該知道的。我不知道如何在運行時執行此操作。不過,我可以建議我們在oracle數據庫中使用的另一個解決方案,它被稱爲VPD(虛擬專用數據庫),基本上可以在表中添加另一列,因此對於每一行,您在列中都有一些值'schemaname',它會過濾基於這個數據的數據。您可以在數據庫會話中設置此值,並且用戶將無法查看具有其他值的行。 – varun 2014-09-25 08:30:02

0

您正在查找的功能稱爲多租戶,Hibernate從版本4.x開始支持此開箱即用功能。請參閱此post關於如何使用此功能。

+0

嗨沙津。感謝您的反饋。是的,我瞭解多租戶如何適用於SaaS。如果您可以請提供一些示例來說明它如何應用於這種多模式J2EE應用程序,這對我非常有用。謝謝。 – Channa 2014-09-26 02:27:26