JPA - многие ко многим, как ElementCollection - PullRequest
2 голосов
/ 21 апреля 2020

У меня есть отношение "многие ко многим", которое назначает метки (только строки) элементам:

+------+   +------------+   +-------+
| ITEM |   | ITEM_LABEL |   | LABEL |
|------|   |------------|   |-------|
|  ID  |<->|  ITEM_ID   | ┌>|  ID   |
|------|   |------------| | |-------|
| .... |   |  LABEL_ID  |<┘ | TEXT  |
+------+   +------------+   +-------+

... и я бы хотел избежать создания класса POJO для метки таблица и сохранить его в классе Item как набор строк. Есть ли способ сделать это с помощью JPA (hibernate) аннотаций?

Я пытался объединить @CollectionTable с @JoinTable, но он, очевидно, не работает:

@Entity
public class Item {

    @Id
    private long id;

    @ElementCollection
    @JoinTable(name = "ITEM_LABEL", joinColumns = @JoinColumn(name = "ITEM_ID"))
    @CollectionTable(name = "LABEL", joinColumns = @JoinColumn(name = "ID", referencedColumnName = "LABEL_ID"))
    @Column(name = "TEXT")
    private Collection<Strings> labels;
}

Может кто-нибудь сказать Как мне включить метки в виде набора строк в классе предметов, пожалуйста? Большое спасибо!

1 Ответ

0 голосов
/ 21 апреля 2020

@JoinTable используется для сопоставления следующих связей с таблицей базы данных: двунаправленные связи «многие к одному / один к многим», однонаправленные связи «многие к одному» и «один к одному» (как двунаправленные, так и однонаправленные).

Если вы действительно хотите иметь Label с его собственной таблицей, вы должны определить его как Entity и затем использовать отношение ManyToMany.

Другим решением будет удалить Label table и сохраните имя метки как LABEL вместо label_id внутри item_label таблицы.

Таким образом, ваши отношения станут

@ElementCollection
@CollectionTable(name = "ITEM_LABEL", joinColumns = @JoinColumn(name = "ITEM_ID"))
@Column(name = "LABEL")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...