【发布时间】:2009-08-04 11:44:12
【问题描述】:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Foo
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class BarFoo extends Foo
mysql> desc foo;
+---------------+-------------+
| Field | Type |
+---------------+-------------+
| id | int |
+---------------+-------------+
mysql> desc barfoo;
+---------------+-------------+
| Field | Type |
+---------------+-------------+
| id | int |
| foo_id | int |
| bar_id | int |
+---------------+-------------+
mysql> desc bar;
+---------------+-------------+
| Field | Type |
+---------------+-------------+
| id | int |
+---------------+-------------+
是否可以将列 barfo.foo_id 指定为连接列?
是否允许将 barfoo.id 指定为 BarFoo 的 @Id,因为您要覆盖类 Foo 的 getter/seeter?
我了解这种关系背后的原理图(或者至少我认为我了解)并且我可以接受。
我想要 BarFoo 的显式 id 字段的原因正是因为我想在查询 BarFoo(s) 或在“更强”约束中使用时避免使用连接键 (foo _id, bar _id)。 (正如鲁本所说)
【问题讨论】:
-
查询 BarFoo 和 Foo 可以分开进行,BarFoo 对 Id 的约束可能比 Foo 更强,同时仍然具有相同的键。我没有直接看到选择联合继承策略并为超类和子类使用不同的 Id 的用途。
-
由于 barfoo.id 不会是唯一的,您如何查询显式 BarFoo 或将其用作另一个表的 fk 约束?
-
由于 barfoo.id 不是唯一的,您如何查询显式 BarFoo:使用 HQL 查询时,您可以简单地查询 BarFoo 而不是 Foo。从 SQL 查询时,您可以使用 BarFoo 和 Foo 表之间的连接。
-
既然 barfoo.id 不会是唯一的,你如何将它用作另一个表的 fk 约束:使用 JPA 在 BarFoo 类和 X 类之间创建 JPA 关联。 Foo 不需要参与其中。
-
以上都有效。但他们实际上并没有回答我的问题。由于 Foo 和 Bar 之间的关系是 ManyToMany,这意味着 BarFoo 将与 Foo 有一个 ManyToOne。因此,您需要 id 列显式引用特定的 BarFoo。也许这意味着尽管您实际上无法将 OneToMany 关系实现为继承,因此我的整个问题与开始无关。