java - 如何将具有共享主键的数据库模式转换为 hibernate ?

标签 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;

最佳答案

如果两个实体有一个主键,它们之间是否存在继承关系?实际上它看起来像连接表继承: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/

相关文章:

java - 如何使用带有 Maven 覆盖层的嵌入式 Jetty

mysql - 插入 ... 在重复 key 更新与截断/插入时

java - 如何在jpa/hibernate中实现这个简单的关联

带有嵌入式数据库的 Java 桌面应用程序

sql - 在 SQL 查询中使用数字时为 "Could not convert variant of type (Null) into type (OleStr)"

java - Hibernate单向多对一和级联删除

java - 组织.hibernate.MappingException : Unknown entity Employee

java - Java 中的多个条件 if() 语句?

java - fragment 上的按钮返回空值指针并使应用程序崩溃

java - 如何在 solr 4.8 中获取字段的总和