Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jpa如何实现模式独立性_Java_Hibernate_Jpa - Fatal编程技术网

Java jpa如何实现模式独立性

Java jpa如何实现模式独立性,java,hibernate,jpa,Java,Hibernate,Jpa,我是jpa和hibernate的初学者,我了解jpa如何实现数据库独立性和持久性提供程序独立性 我偶然发现了这样一句话 jpa can achieve schema independence jpa是如何实现这一点的?jpa是一个API,这个API完全从您的数据表示和DDL中抽象出来。此外,它是从API实现中抽象出来的(与直接用于Hibernate不同) 这意味着您可以: 使用不同的JPA实现,如Hibernate或Toplink 使用不同的数据库方言,如Oracle、T-SQL、Postg

我是jpa和hibernate的初学者,我了解jpa如何实现数据库独立性和持久性提供程序独立性

我偶然发现了这样一句话

jpa can achieve schema independence

jpa是如何实现这一点的?

jpa是一个API,这个API完全从您的数据表示和DDL中抽象出来。此外,它是从API实现中抽象出来的(与直接用于Hibernate不同)

这意味着您可以:

  • 使用不同的JPA实现,如Hibernate或Toplink
  • 使用不同的数据库方言,如Oracle、T-SQL、PostgreSQL
  • 实现您自己的JPA实现
这些可以通过注释和/或配置完成。因此,从理论上讲,您可以从Oracle切换到PostgreSQL,而无需重新编译应用程序

这也意味着你可以做其他有趣的事情,比如:

  • 使用免费的开源数据库进行开发,然后使用Oracle/SQL Server进行生产
  • 使用高超音速进行自动测试,因此所有内容都存储在内存中并自动拆除
  • 透明地使用其他数据源,如XML
您还可以获得其他一些好处,如SQL注入保护开箱即用、启动时间非常快(而不必对所有内容进行两次编码)、定义实体后自动生成DDL等,这些优点使小型项目比传统路线启动得更快

实际上:

  • 没有人选择从Hibernate转到Toplink
  • 很少有人为一个项目实现JPA
  • 很少有人会快速切换数据库后端,因为每个数据库的性能都非常不同
  • 此外,不同的方言也能驱赶奇怪的虫子
不过,配置方面和使用诸如高超音速的东西的能力是有用的


可爱的API抽象的另一个“反面”是,实现可能过于约束,导致生成的SQL非常低效。这最终导致开发人员不得不添加本机SQL。

模式独立性可以通过与DB和提供程序独立性相同的方式实现-可以简单地在配置中更改所有表的模式。您可以通过
persistence unit defaults
更改persistence.xml中包含的orm.xml文件中的默认模式


您也可以通过@Table annotations指定模式。

感谢您的精彩解释,但关于模式独立性的问题仍然没有答案?在一个数据库上可以有许多模式。它意味着传统/概念术语中的模式,如“DDL的形状和方言”。JPA使您远离数据存储的特定于SQL的实现。不要把“模式”看作是单个数据库的一部分。你“偶然发现了这个句子”。。。请告诉我们它的位置和含义?如何为另一个模式提供用户名和密码?因为我在@Table注释中使用了schema,它说找不到表。在一个JPA持久化单元中,您总是使用一个用户。不能指定特殊用户来访问架构内的表。您需要为单个用户分配访问所有架构的权限。如果您需要使用两个用户,您可以将您的实体划分为两个不同的持久化单元,但您可以像在两个不同的数据库中一样使用它们,这意味着您必须使用不同的实体管理器,当然,在单独的事务中使用它们,除非您将事务作为XA事务绑定在一起。