JPA: @PrimaryKeyJoinColumn или @JoinColumn + @Id - PullRequest
0 голосов
/ 13 марта 2019

У меня есть класс пользователя с аннотацией @Entity.

@Entity
public class User{

@Id
@GeneratedValue
private Long id;

private String firstName;
private String lastName;

}

И мне нужно создать еще одну таблицу с данными пользователя.Он должен быть связан с User_id и не иметь собственного идентификатора: user_id phone_number address

Итак, теперь я использую это:

@Entity
@Table
@Data
public class UserDetails{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(nullable = false)
    private Long id;

    @OneToOne (fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @PrimaryKeyJoinColumn
    private User user;

    private String address;
    private String phone;
}

Но у меня естьвопрос: Почему я использую это:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(nullable = false)
private Long id;

, если

@OneToOne (fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn
private User user;

делает для меня user_id?

Если я удаляю поле Id, у меня появляется ошибка: Нет идентификаторауказано для объекта: test.UserDetails, но эй!@PrimaryKeyJoinColumn создает идентификатор для этой сущности.

Может быть, я должен использовать @Id + @JoinColumn вместо @PrimaryKeyJoinColumn?

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

Поскольку @Entity всегда должен иметь @Id, вы можете использовать следующий фрагмент для сопоставления обоих объектов

@Id
@Column(name="user_id")
private Long id;

@OneToOne (fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn(name="user_id", referencedColumnName="user_id")
private User user;
1 голос
/ 13 марта 2019

Это просто часть спецификации.@Entity всегда должен иметь @Id.В этом примере вам даже не нужен (strategy = GenerationType.IDENTITY), поскольку ключ предоставляется родительским объектом (поэтому нет необходимости использовать какую-либо стратегию для его генерации).

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