Hibernate @SecondaryTable-指定主表的外键

时间:2019-01-03 17:08:23

标签: java spring postgresql hibernate jpa

我有两个表:

  1. 语言

    CREATE TABLE language (
      id   BIGSERIAL,
      name TEXT NOT NULL UNIQUE,
      PRIMARY KEY (id)
    );
    
  2. 翻译

    CREATE TABLE translation (
      id                BIGSERIAL,
      language_id       BIGINT REFERENCES language (id),
      translation_key   TEXT NOT NULL,
      translation_value TEXT NOT NULL,
      PRIMARY KEY (id)
    );
    

    我想获得这样的实体,其中翻译表(主表)通过主表中的language_id连接语言表。 问题:目前通过翻译PK(id)加入。

    @Entity
    @Table(name = "translation")
    @SecondaryTable(name = "language", pkJoinColumns = @PrimaryKeyJoinColumn(name = "id"))
    public class Translation {
    
        @Id
        @Column(name = "id")
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private long id;
    
        @Column(table = "language", name = "name")
        // ON translation.language_id = language.id
        private String language;
    
        @Column(name = "translation_key")
        private String translationKey;
    
        @Column(name = "translation_value")
        private String translationValue;
    
        // getters and setters
    }
    

    我应该在代码中的哪里正确指定它? SQL示例: SELECT t.id, l.name, translation_key, translation_value FROM translation t INNER JOIN language l on t.language_id = l.id;

2 个答案:

答案 0 :(得分:1)

您不能将@SecondaryTable用于描述的目的。

@SecondaryTable用于将单个实体分布在多个表中的情况。实体的每个“部分”都必须由实体私有拥有,并且与其他每个“部分”都具有一对一的关系。

如果您想在翻译和语言之间建立多对一关系,则需要使用@ManyToOne(并创建一个单独的Language实体)。

答案 1 :(得分:0)

@SecondaryTable(name = "language")

这样,如果您指定pkJoinColumn,它将为翻译ID生成值并将其自动插入到语言外键中,它将通过主键关联表,而如果您不提及那将通过外键来完成。之后,您需要为语言表ID列创建触发器和序列。应该可以。