我有以下 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;
最佳答案
如果两个实体有一个主键,它们之间是否存在继承关系?实际上它看起来像连接表继承:Inheritance mapping .根据javadocs 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;
.....
}
但是模式生成器中存在错误 - 它不会创建外键。您可以手动创建它。
关于java - 如何将具有共享主键的数据库模式转换为 hibernate ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32567567/