@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)。 (正如鲁本所说)
答案 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 {
...
}