Java 如何为@Inheritation JPA注释指定不同的列

Java 如何为@Inheritation JPA注释指定不同的列,java,jpa,Java,Jpa,是否可以将列barfo.foo_id指定为联接列 由于您正在重写类Foo的getter/seeter,是否允许将barfoo.id指定为barfoo的@id 我理解这种关系背后的原理图(或者至少我认为我理解),我同意它们 我需要BarFoo显式id字段的原因正是因为我希望在查询BarFoo或在“更强”约束中使用时避免使用连接键(foo _id,bar _id)。(正如鲁本所说)当定义InheritanceType.JOINED时,@Id列将自动用于连接。Barfoo实例只有一个id值,该id值将

是否可以将列barfo.foo_id指定为联接列

由于您正在重写类Foo的getter/seeter,是否允许将barfoo.id指定为barfoo的@id

我理解这种关系背后的原理图(或者至少我认为我理解),我同意它们


我需要BarFoo显式id字段的原因正是因为我希望在查询BarFoo或在“更强”约束中使用时避免使用连接键(foo _id,bar _id)。(正如鲁本所说)

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


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

签出@PrimaryKeyJoinColumn

@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         |
+---------------+-------------+

可以分别查询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之间的关系是多个,这意味着BarFoo将与Foo有多个关系。因此,您需要id列来显式地引用特定的BarFoo。也许这意味着,虽然你不能真正实现一对一的关系作为继承,因此我的整个问题与开始无关。
@PrimaryKeyJoinColumns({
    @PrimaryKeyJoinColumn(name="CHILD_PK1", 
        referencedColumnName="PARENT_PK1"),
    @PrimaryKeyJoinColumn(name="CHILD_PK2",
        referencedColumnName="PARENT_PK2")
})
public class Child extends Parent {
    ...
}