我有以下postgres架构,其中primary key
定义为PK
和foreign key
:
CREATE TABLE main_table(
id integer NOT NULL,
CONSTRAINT main_table_pk PRIMARY KEY (id),
//some fields
)
CREATE TABLE test(
id integer NOT NULL,
CONSTRAINT test_pk PRIMARAY KEY (id),
CONSTRAINT test_fk FOREIGN KEY (id)
REFERENCES main_table (id) MATCH SIMPLE
)
我想创建一个自动生成相同模式的hibernate映射:
@Entity
public class MainTable {
@Id private int id;
@OneToOne
private Test test;
}
@Entity
public class Test {
@Id private int id;
@OneToOne
@PrimaryKeyJoinColumn(name = "id", foreignKey = @ForeignKey(name = "fk_id"))
private MainTable mainTable;
}
结果:外键约束完全丢失:
CREATE TABLE test(
id integer NOT NULL,
CONSTRAINT test_pk PRIMARAY KEY (id)
)
为什么缺少外键约束?我该怎么办?
有趣的是:以下内容将在Test表中创建一个外键条目,但作为一个单独的列:
@OneToOne
@JoinColumn
private MainTable mainTable;
答案 0 :(得分:1)
如果两个主人有一个主键可能会有继承吗?实际上它看起来像连接表继承:Inheritance mapping。根据{{3}},PrimaryKeyJoinColumn 用于连接JOINED映射策略中实体子类的主表。因此,如果没有继承,则无法使用PrimaryKeyJoinColumn。这很简单。
您可以尝试:
@Entity
public class MainTable {
@Id
private int id;
@OneToOne(mappedBy = "mainTable" )
private Test test;
.......
}
@Entity
public class Test {
@Id
private int id;
@OneToOne
@JoinColumn(name = "id", foreignKey = @ForeignKey(name = "fk_id"))
private MainTable mainTable;
.....
}
但架构生成器中存在错误 - 它不会创建外键。您可以手动创建它。