Мне трудно выбрать между использованием @IdClass или @Embeddable для моделирования составного первичного ключа для отношения БД OneToMany, показанного ниже.
Как видите, 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
, тем лучше!
Заранее спасибо!