2011-01-13 80 views
2

有一個使用Java + Hibernate + PostgreSQL的企業應用程序。 Hibernate通過Java源代碼中的註釋進行配置。到目前爲止,數據庫模式是固定的,但我面臨的問題是它需要是動態的:我可以接收來自不同位置的數據,並且我必須將這些數據存儲在不同的表中。這意味着我必須創建表運行時。幸運的是,所有來自不同研究機構的數據似乎都具有相同的模式。但我仍然不知道如何使用Hibernate來做到這一點。有兩個主要問題:在Hibernate環境中動態創建表

  1. 如何告訴Hibernate許多不同的表具有相同的結構?例如,「Patient」類不僅可以映射到「患者」表,而且還可以映射到「patient_mayo_clinic」表,「patient_northwestern」表等。我可以感覺到這會導致模糊性:Hibernate如何知道當我訪問哪個表時在Patient類上進行操作?它可以是前列表中的任何一個(但只有一個)。
  2. 我該如何動態地使用Hibernate創建表並將類綁定到它們?

應對建議: 感謝所有的建議。到目前爲止,所有的答案都不鼓勵動態創建表格。我會標記Axel的答案,因爲它實現了某些目標,並且它是一個受支持的解決方案。更具體地說,它被稱爲多租戶。有時候瞭解一些描述我們問題的重要短語(或者我們的問題的一部分)很重要。 以下是有關多租戶一些鏈接:

在現實世界中的場景多租戶還包括隔離套的區域的數據(也就是通過不同憑據訪問和授權的方式)電子表格。

回答

4

你不能用Hibernate來做到這一點。

爲什麼不用研究所專欄擴展患者表?

這樣你就可以區分,而不會遇到映射問題。

+0

謝謝阿克塞爾。我想過,但我會看看是否有人提供其他建議。 – 2011-01-13 22:58:58

+0

那麼,你有這種方法:http://www.docjar.org/docs/api/org/hibernate/cfg/Configuration.html#add%28Document%29,但正如javadoc所說:配置只是作爲一個初始化時間對象。 SessionFactorys是不可變的,不會保留任何關聯回配置。 – 2011-01-14 12:01:24

3

恐怕你不能在Hibernate中輕鬆做到這一點。您必須生成Java源代碼,編譯它,將其添加到您的類路徑中,並使用java.reflection包動態加載它。如果這是有效的,我懷疑它會是一個醜陋的解決方案(恕我直言)。

您是否考慮過使用架構較少的數據庫,即:NoSQL databasesRDF 數據庫。它們在你可以存儲的東西方面更加靈活,基本上對於關係模式來說並不緊密。

+0

我明白你的觀點。我沒有想到它需要數據庫管理員權限才能創建表格。我意識到NoSQL的運動,在MongoDB上看到了演示。我還沒有聽說過RDF數據庫。 – 2011-01-13 23:00:09

+1

RDF是w3c作爲標準推廣的數據模型。它基於三元組和圖形的概念。使用Jena API(用於RDF的Java API)介紹RDF。 http://jena.sourceforge.net/tutorial/RDF_API/ – 2011-01-13 23:19:08

2

在大多數環境中,動態創建表不是一個好主意,因爲dbas不會授予您在生產中創建表的權限。

Axel的回答可能對您有幫助。還可以查看Inheritance Mapping的Hibernate。

1

我同意,它不建議創建表動態儘管如此,它是可行的。

個人而言,我會做的阿克塞爾·方丹建議,但如果動態表是一個必須具備的你,我會考慮使用Partitioning

PostgreSQL允許你創建ONA主表和幾個子表(分區),記錄孩子的表之間析取,而是從任何子表中的每個記錄是在父表中可見。這意味着你可以插入行你想只用簡單的插入語句中的任何子表(其不冷靜但具有複雜的同一水平構成和堅持一個實體,所以它在你的情況可以接受的)和查詢數據庫使用HQL