【问题标题】:Cross database joins in JPAJPA 中的跨数据库连接
【发布时间】:2011-08-16 21:15:55
【问题描述】:

是否可以在 JPA 中进行跨数据库表连接?

我在一个数据库中有一个users 表,它有一个指向另一个数据库中organizations 表的外键。两个数据库都在同一台物理机器上。现在 MySQL 允许我编写跨多个数据库的查询,但我不知道如何使用 JPA 执行此操作。

Java POJO 上的@Entity 注释不采用数据库名称,因此无法标记跨数据库关系。

这种情况有解决方法吗?也许使用原生查询来加载连接的实体?

【问题讨论】:

    标签: mysql database jpa jpa-2.0 cross-database


    【解决方案1】:

    我们尝试了以下方法,似乎可行。

    1) @Table 注释中没有架构属性

    2) 为实体创建不同的 orm 文件,这些实体由它们所在的模式组成。

    3)在每个orm文件中,可以添加一个“my_schema”。

    4) 在persistence.xml中包含你各自PU中的orm文件

    5) 如果您在测试期间需要不同的数据库,请创建类似的 orm 文件进行测试并相应更改架构中的值并将这些 orm 文件包含在单独的 PU 中

    HTH

    【讨论】:

      【解决方案2】:

      如果 MySQL 允许您编写跨数据库查询的 SQL,那么您可以在 JPA 的本机查询中使用此 SQL。

      我假设您正在使用某种数据库链接机制? 如果是这样,那么您也应该能够映射它。您可以将链接数据库的@Table 上的“模式”设置为链接名称。

      @Table(name="organizations", schema="org_schema@org_db")
      

      【讨论】:

      • +1 哇,我不知道。在我之前的项目中,这会让我的生活更轻松。谢谢詹姆斯!
      【解决方案3】:

      你不能。因为每个实体都绑定到一个持久化上下文,并且上下文绑定到一个数据库。

      如果你所说的数据库是指同一服务器上的架构,你可以做两件事

      • 在其中一个架构上创建一个视图,指向另一个架构上的表。缺点是您可能需要映射一个实体两次(每个架构一次)
      • 使用连接创建一个视图并从那里映射您需要的任何值。缺点是实体将是只读的。

      如果两个模式都在不同的数据库上,那么您必须在代码中手动进行连接。

      给你一个问题。您提到的“外键”是真正的数据库外键还是逻辑外键?

      【讨论】:

      • 这是一个逻辑外键。并且数据库是真正独立的 MySQL 数据库,尽管在同一台物理机器上。
      • 由于上述原因,您将无法进行连接。如果您尝试从不同应用程序或服务管理的数据库中读取数据(如果您正在做一些与 SOA 相关的事情),这可能是有意义的。解决方案是在您的代码中加入。
      • 我采取了第一种方法,它奏效了。我还测试了视图上的连接查询与不同数据库的表上的相同查询的性能,结果它们几乎相同。
      猜你喜欢
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 2011-03-25
      • 1970-01-01
      • 2011-10-21
      • 2010-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多