如何使用共享主键将数据库模式转换为hibernate?

时间:2015-09-14 14:37:51

标签: java database hibernate

我有以下postgres架构,其中primary key定义为PKforeign 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;

1 个答案:

答案 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;
     .....
 }

但架构生成器中存在错误 - 它不会创建外键。您可以手动创建它。