我的数据库中有两个看起来像这样的表,外键从job_label.job_id
到job_record
中的等效列。此外,job_id
中label_key
,label
和job_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
。我已经尝试过使用ManyToOne
和OneToMany
映射,但是失败了,因为Id
中没有JobLabelRecord
列(并且我对它们没有任何作用)。
我应该在这里使用ElementCollection
吗?我也尝试过,但是没有成功。
这里有什么想法吗?谢谢!
答案 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
。