【问题标题】:@Entity Relation between tables on different databases@Entity 不同数据库表之间的关系
【发布时间】:2013-04-13 02:33:04
【问题描述】:

我是 Java Enterprise 和 JPA 的新手(使用 Netbeans 的 EclipseLink JPA 2.0)。 我正在尝试实现不同项目和包中不同@Entity类之间的链接,但没有成功。

数据库 D1 有一个表 T1 和一个同义词 T2 引用数据库 D2 上的表 T2。

所以我创建了 2 个项目(罐子):

D1-jpa 包含 @Entity package1.T1.class 和 persistence.xml(也映射 T2)

D2-jpa 包含@Entity package1.T2.class 和 persistence.xml

我需要创建一个从 T1 到 T2 的 @OneToOne 关系,以便 T1 具有

@OneToOne

公共 T2 t2;

问题是当我尝试执行简单的 JPQL 查询时:

从 T1 t 中选择 t

翻译后的查询类似于

SELECT t.field1, t.field2, T2_t2 FROM T1 t; -- "T2_t2"??

当我期待某事时 从 T1 t1、T2 t2 中选择 t1.field1、t1.field2、t2.field1

WHERE(连接条件)

你对这个问题有什么解决方案?如果 D1 上的同义词与 D2 上的真实表的名称不同(同义词 TT2 引用 D2 上的 T2 ...)怎么办?

考虑所有。

F.

【问题讨论】:

  • "使用复合持久性单元:可以在复合中的任何实体之间建立映射关系。"这看起来不错,但它与使用从一个数据库到另一个数据库的同义词连接表相同(例如性能)?

标签: jpa netbeans entity eclipselink one-to-one


【解决方案1】:

纯 JPA 中的@OneToOne 仅在目标是此持久性单元中的实体时才有效。由于您没有遇到异常,因此它的工作方式好像两者都可以由 D1 持久性单元类加载器找到并处理。该映射将 T1->T2 外键字段默认为“T2_t2”,这可能是因为您的 T2 实体将 t2 字段或属性标记为其 ID。如果您希望将不同的数据库列用作外键,则需要在关系上指定连接列。

我不清楚你的目的,因为 T1 必须能够导入 T2,所以它们不是完全分开的 - 表也应该在同一个数据库中,以便它们之间存在 1:1。但是您可以通过此处描述的 EclipseLink 中的复合持久性单元功能将多个持久性单元组合在一起并将它们作为一个整体使用 http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Advanced_JPA_Development/Composite_Persistence_Units

【讨论】:

  • 你说得对其实是ManyToOne关系(D1是一个包含人的数据库,D2是一个包含Doctors的数据库,一个人有一个Doctor,Doctor很多人)我把它改成了OneToOne来简化例子但是我错了。也许在真正的代码中,OneToOne 关系不像你说的那样工作。我会看提供的链接,谢谢。问候。
猜你喜欢
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
相关资源
最近更新 更多