2015-09-07 63 views
0

我是jpa和hibernate的初學者,我瞭解jpa如何實現數據庫獨立性和持久性提供者獨立性。jpa如何實現模式獨立

我碰到其中規定

jpa can achieve schema independence 

如何JPA實現這個句子來了?

+0

你「碰到了這個句子」......謹慎地告訴我們在哪裏,它應該是什麼意思? –

回答

0

JPA是一個API,這個API是完全從您的數據表示和DDL抽象。此外,它從API實現中抽象出來(與直接進入Hibernate不同)。

這意味着您可以:

  • 使用不同的JPA實現,如Hibernate或Toplink的
  • 使用不同的數據庫方言如Oracle,T-SQL,PostgreSQL的
  • 實現自己的JPA實現

這些可以通過註釋和/或配置完成。所以理論上你可以從Oracle切換到PostgreSQL,而無需重新編譯你的應用程序。

這也意味着你可以做其他時髦的東西,如:

  • 使用一個免費,開源數據庫的發展,那麼Oracle/SQL Server進行生產
  • 使用高超的自動化測試,所以一切在內存中並自動拆除。
  • 透明地使用XML等其他數據源。

你得到其他細微像SQL注入防護開箱即用,非常快的啓動時間(而不是兩次代碼一切),自動生成DDL的時候已經定義了你的實體等,這些讓小項目開工比傳統路線更快。

現實:

  • 沒有人選擇從休眠去TOPLINK
  • 極少數人永遠不會實現JPA的一個項目
  • 極少數人快速切換DB後端,因爲每個數據庫執行非常不同
  • 此外,不同的方言可以驅除怪異的錯誤。

雖然配置方面和使用像Hypersonic之類的東西的能力很有用。

可愛的API抽象的另一個「反面」是實現可能過於約束,導致生成非常低效的SQL。最終,開發人員不得不添加本機SQL。

+0

感謝您的好解釋,但仍然沒有解決關於模式獨立性的問題嗎?單個數據庫上可以有很多模式。 – eatSleepCode

+0

這意味着架構在傳統/概念術語中就像「DDL的形狀和方言」一樣。 JPA使您遠離數據存儲的SQL特定實現。在「模式」方面不要把它看作是單個數據庫的一部分。 –

0

可以通過與數據庫和提供者獨立相同的方式實現模式獨立性 - 可以在配置中簡單地更改所有表的模式。您可以更改持久性中包含的orm.xml文件中的默認模式。xml via persistence-unit-defaults

您也可以通過@Table註釋指定模式。

+0

如何爲另一個模式提供用戶名和密碼?因爲我在@Table註釋中使用了架構,它說沒有找到表。 – eatSleepCode

+0

在單個JPA持久性單元中,您始終使用單個用戶。您不能指定特殊用戶來訪問模式中的表。您需要分配權限才能將所有**模式訪問到**單個用戶**。 – OndrejM

+0

如果您需要使用2個用戶,您可以將您的實體分爲2個不同的持久性單元,但是您可以像使用2個不同的DB一樣使用它們,這意味着您必須使用不同的實體管理器,並且當然要使用它們在單獨的交易中,除非您將交易作爲XA交易捆綁在一起。 – OndrejM