我有两个表:
语言
CREATE TABLE language (
id BIGSERIAL,
name TEXT NOT NULL UNIQUE,
PRIMARY KEY (id)
);
翻译
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;
答案 0 :(得分:1)
您不能将@SecondaryTable
用于描述的目的。
@SecondaryTable
用于将单个实体分布在多个表中的情况。实体的每个“部分”都必须由实体私有拥有,并且与其他每个“部分”都具有一对一的关系。
如果您想在翻译和语言之间建立多对一关系,则需要使用@ManyToOne
(并创建一个单独的Language
实体)。
答案 1 :(得分:0)
@SecondaryTable(name = "language")
这样,如果您指定pkJoinColumn
,它将为翻译ID生成值并将其自动插入到语言外键中,它将通过主键关联表,而如果您不提及那将通过外键来完成。之后,您需要为语言表ID列创建触发器和序列。应该可以。