JPA和非原始ElementCollection

时间:2019-05-29 17:36:47

标签: java jpa

我的数据库中有两个看起来像这样的表,外键从job_label.job_idjob_record中的等效列。此外,job_idlabel_keylabeljob_record的三元组具有唯一约束。

mysql> select * from job_record;
+--------+---------+
| job_id | state   |
+--------+---------+
|      1 | success |
|      2 | running |
|      3 | errored |
|      4 | success |
+--------+---------+

mysql> select * from job_label
+--------+-----------+--------+
| job_id | label_key | label  |
+--------+-----------+--------+
|      1 | name      | job 1  |
|      1 | type      | normal |
+--------+-----------+--------+

在Java类方面,我有这个类:

@Entity
@Table(name = "job_record")
public class JobRecord {

    @Id
    @Column(name = "job_id")
    private String jobId;

    @Enumerated(EnumType.STRING)
    @Column(name = "state")
    private JobState state;
}

我试图为job_label定义一个看起来像这样的类:

public class JobLabelRecord {
    @Enumerated(EnumType.STRING)
    @Column(name = "label_key")
    private JobLabelKey key;

    @Column(name = "label")
    private String label;
}

然后我想要JobRecord中的一个字段,以List<JobLabelRecord>的身份为我提供该工作的所有标签。但是,我没有尝试过。

我尝试将JobLabelRecord声明为Embeddable,并将JobRecord中的等效字段声明为Embedded。我已经尝试过使用ManyToOneOneToMany映射,但是失败了,因为Id中没有JobLabelRecord列(并且我对它们没有任何作用)。

我应该在这里使用ElementCollection吗?我也尝试过,但是没有成功。

这里有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

您可以通过搜索“ jpa elementcollection分离表”(例如JPA Tutorial - JPA ElementCollection CollectionTable Override Example)找到一个简单的示例。将此示例应用于您的问题将给出以下信息:

ObservableCollection

还请注意@Entity @Table(name = "job_record") public class JobRecord { @Id @Column(name = "job_id") private Integer jobId; @Enumerated(EnumType.STRING) @Column(name = "state") private JobState state; @ElementCollection @CollectionTable(name="job_label", joinColumns=@JoinColumn(name="job_id")) private List<JobLabelRecord> labels; ... @Embeddable public class JobLabelRecord { @Enumerated(EnumType.STRING) @Column(name = "label_key") private JobLabelKey key; @Column(name = "label") private String label; ... ID应该是JobRecord