2015-09-07 101 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