【问题标题】:How to specify a different column for a @Inheritance JPA annotation如何为 @Inheritance JPA 注释指定不同的列
【发布时间】: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 关系实现为继承,因此我的整个问题与开始无关。

标签: java jpa


【解决方案1】:

当定义 InheritanceType.JOINED 时,@Id 列将自动用于连接。一个 Barfoo 实例只有一个 id 值,并且它保存在 foo 和 barfoo 表的 id 列中。

barfoo 表中不需要有单独的 id 和 foo_id 列。默认情况下也不需要覆盖 barfoo 中的 id getter 和 setter。如果 Barfoo 实例的 id 比 Foo 实例的 id 具有更强的约束,您只会覆盖 id setter 和 getter。

【讨论】:

    【解决方案2】:

    查看@PrimaryKeyJoinColumn

    @PrimaryKeyJoinColumns({
        @PrimaryKeyJoinColumn(name="CHILD_PK1", 
            referencedColumnName="PARENT_PK1"),
        @PrimaryKeyJoinColumn(name="CHILD_PK2",
            referencedColumnName="PARENT_PK2")
    })
    public class Child extends Parent {
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 2013-10-10
      相关资源
      最近更新 更多