2015-02-05 90 views
-1

一個模式,我試圖啓用我的Web應用程序使用每個用戶一個(MySQL的)架構。 我正在使用彈簧JPA連同休眠。 Hibernate多租戶概念是否相關? 我試圖做到這一點的方法是Web應用程序的每個用戶

  • (一)有EntityManagerFactoryHTTPSession
  • (B)設置爲登錄在它的模式。

我已經想出瞭如何做(二),但我仍然有問題在做(一)。 我試過把@Scope(WebApplicationContext.SCOPE_SESSION),但全球EntityManagerFactory呢?

任何幫助?

+1

您不希望每個會話都有一個EntityManagerFactory。創建一個花費太多時間,而且它沒有意義,並且使事情變得非常複雜。你基本上有一個多租戶的情況,你應該適當地配置。在多租戶設置中,您應該只有一個「EntityManagerFactory」。 – 2015-02-05 20:28:27

+0

你能詳細介紹一下如何進行approprietely配置嗎?請記住,我需要一個連接池,但每個用戶的模式不同(HttpSession)。 – mprasinos 2015-02-05 23:37:05

回答

0

您可以實現自己的ConnectionProvider,有做額外的設置。 但是我認爲如果你想爲每個用戶創建一個模式,那麼你的應用程序的體系結構就會有很大的問題。

UPD1

如果您使用的春天。您可以嘗試在Session範圍內聲明一個具有自己的ConnectionProvider impl的bean。

但是有一個很大的問題。 Hibernate創建ConnectionProvider。這意味着你必須自己IMPL ServiceRegistry(通過彈簧工作),並覆蓋StandardServiceRegistryBuilder,並實現了一套EntityManagerFactoryBuilder(基於EntityManagerFactoryBuilderImpl但你StandardServiceRegistryBuilder)。

當新的會話已經建立,它會使用的ConnectionProvider來創建連接(也許你將不得不重寫一些類)。

+0

這並沒有回答這個問題:我如何定義每個HttpSession使用哪些設置? – mprasinos 2015-02-05 17:39:45

+0

查看詳情UPD1 – SergSW 2015-02-05 19:23:55

0

這真的不建議。這將在後面害你,你不能對不同勢用戶做不同的架構。您可以隨時創建自己的連接屬性..

Configuration cfg = new Configuration(); 
cfg.configure(); 
System.setProperty("hibernate.connection.password",pass); 
System.setProperty("hibernate.connection.username",usr); 
System.setProperty("hibernate.connection.driver_class", driver_class); 
System.setProperty("hibernate.connection.url", driver_url); 
System.setProperty("hibernate.dialect", dialect); 
// etc, etc, for all properties 
cfg.setProperties(System.getProperties()); 
sessionFactory = cfg.buildSessionFactory(); 

它可以是這樣的東西..但這是錯誤的!

相關問題