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

时间:2009-08-04 11:44:12

标签: java jpa

@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时或在“更强”的约束中使用时避免使用连接键(foo _id,bar _id)。 (正如鲁本所说)

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

查看@PrimaryKeyJoinColumn

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