#spring-data-jpa
Вопрос:
Вот у меня есть 2 основные независимые таблицы user
amp; detail
и 3-я, которые связывают друг друга users_details
двумя внешними ключами , как показано ниже:
----------- ------------------ ------ ----- --------- -------
| Field | Type | Null | Key | Default | Extra |
----------- ------------------ ------ ----- --------- -------
| user_id | int(10) unsigned | NO | MUL | NULL | |
| detail_id | int(10) unsigned | NO | MUL | NULL | |
----------- ------------------ ------ ----- --------- -------
Чтобы реализовать это в Spring Data JPA, я использую этот класс, который отображает ошибку Persistent entity 'UsersDetails' should have primary key
:
@Data
@Entity
@Table(name = "users_details")
public class UsersDetails {
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")
private User user;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "detail_id")
private Detail detail;
}
Поскольку у меня нет никакого первичного ключа, как мне обойти это?
Или я должен сделать его, даже если он не используется?
Комментарии:
1. Вы должны либо добавить
@id
столбец в свою сущность JPA, либо сделать комбинациюuser_id
иdetail_id
первичный ключ этой таблицы/сущности.2. Вот что я подумал. Спасибо тебе!
3. Опция составного ключа довольно уродлива… Я никогда не делал этого сам, и я часто склонен просто добавлять столбец автоматического увеличения к сущности, что легко сделать.
4. Хотя использование составных ключей некрасиво, их может потребоваться использовать, когда из-за проблем с производительностью не допускается наличие ключа под таблицей или вы хотите сопоставить представление базы данных с java с помощью JPA и т. Д.
Ответ №1:
Вам не нужно составлять карту таблицы users_details
. Вы можете позволить JPA управлять им автоматически, определив отношения «многие ко многим».
Вы можете увидеть здесь пару примеров на случай, если вы хотите отобразить его однонаправленно или двунаправленно.
Если вы хотите сопоставить его по какой-либо причине, способ сопоставить его-создать составной ключ с обоими значениями (типичный способ создания таблицы отношений «многие ко многим»). Все объекты JPA должны иметь идентификатор, поэтому вы не можете избежать отсутствия идентификатора. В приведенном выше репо приведен пример составного ключа. Вам нужно будет аннотировать поля @Id
и предоставить класс составного ключа @IdClass
.
Комментарии:
1. Огромное вам спасибо, сэр, за отличный ресурс и объяснение!