Java 如何将具有共享主键的数据库模式转换为hibernate?
我有以下postgres模式,主键定义为Java 如何将具有共享主键的数据库模式转换为hibernate?,java,database,hibernate,Java,Database,Hibernate,我有以下postgres模式,主键定义为PK和外键: 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
PK
和外键
:
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)
)
为什么缺少外键约束?我能做什么
有趣的是:以下内容将在测试表中创建一个外键条目,但作为一个单独的列:
@OneToOne
@JoinColumn
private MainTable mainTable;
如果两个实体有一个主键,它们之间是否存在继承关系?实际上,它看起来像联接表继承:。根据PrimaryKeyJoinColumn,用于在联接映射策略中联接实体子类的主表。因此,如果没有继承,就不能使用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;
.....
}
但是模式生成器中有一个错误——它不创建外键。您可以手动创建它。它们是具有由相同id=主键标识的行的表。一个表应该是“根”,但我想有两个表来分隔内容。