JPA-аннотация: OneToMany с использованием составного первичного ключа, который также является внешним ключом, @IdClass или @Embeddable - PullRequest
0 голосов
/ 14 апреля 2020

Мне трудно выбрать между использованием @IdClass или @Embeddable для моделирования составного первичного ключа для отношения БД OneToMany, показанного ниже.

relationship table

Как видите, user_id - это PK таблицы user, а user_merchant использует оба его merchant_id и user_id, который также является FK, как его составной ключ. Таблица user_merchant отслеживает продавцов, с которыми пользователь мог иметь дело. Пользователь может иметь дело с несколькими продавцами и наоборот.

В «обычном порядке», где также существует таблица «merchant», мне очень легко моделировать с аннотацией JPA. Однако в этом случае я немного растерялся. Хотя это отношение «многие ко многим», я склоняюсь к тому, чтобы моделировать его как однонаправленное отношение «один ко многим», поскольку нет таблицы «merchant», и только сущность «user» должна знать об этом. о его отношениях с торговцем, а не наоборот.

В сущности Пользователь я надеюсь смоделировать ее так:

@Entity
@Table(name = "user")
public class User extends Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column
    private Long userId;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private Set<Merchant> merchants;

}

Для сущности Торговец это немного сложно ,

public class Merchant implements Serializable{

    @Column
    private String merchantId;

    .....

}

Запуск этого фрагмента кода завершится неудачей, если @Id не указан в Merchant классе. Должен ли я использовать @IdClass или @ Embedded / @ Embeddable в этом случае, и если да, то как это сделать?

Имеет ли смысл вводить новый объект в класс Merchant, как показано ниже?

@Id
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "location_id")
private UserEntity userEntity;

Или мне нужен только идентификатор пользователя в этом классе. И чем мне заполнять это поле при первом сохранении объекта User? Чем меньше ссылок мне нужно поддерживать в классе Merchant, тем лучше!

Заранее спасибо!

...