JPA и не примитивная ElementCollection - PullRequest
0 голосов
/ 29 мая 2019

В моей базе данных есть две таблицы, которые выглядят примерно так: внешний ключ от 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, но это не удается, потому что в JobLabelRecord нет столбцов Id (и я ничего не делаю с этими работами правильно).

Должен ли я бытьвместо этого используется ElementCollection?Я тоже это попробовал, но безуспешно.

Есть идеи здесь?Спасибо!

1 Ответ

1 голос
/ 29 мая 2019

Вы можете найти простой пример для этого, выполнив поиск "jpa elementcollection отдельная таблица", например, Учебник JPA - JPA ElementCollection CollectionTable Override Example . Применение этого примера к вашей проблеме дает следующее:

@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;
...

Обратите внимание, что идентификатор JobRecord, вероятно, должен быть Integer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...