JPA OneToOne ОБНОВЛЕНИЕ вместо ВСТАВКИ - PullRequest
0 голосов
/ 05 июля 2018

Я новичок в Spring / JPA и пытаюсь использовать взаимосвязь с базой данных @annotations, чтобы упростить мой код.

У меня есть две сущности: сущность пользователя и токена. Когда setToken () вызывается для пользователя, я хочу, чтобы токен перезаписывал любые старые токены, связанные с пользователем в таблице.

В настоящий момент новый токен (через user.setToken ()) вставляется, а не ОБНОВЛЯЕТ.

Как мне добиться этих отношений? В "Lame-mans" ... У пользователя может быть только один токен и ему может быть предоставлен другой в любое время, исключая старый. В этих моделях есть дополнительные поля, которые я обрезал для ясности.

@Entity
@Table(name = "Users")
public class User {

    @Column(name = "USER_ID")
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Long userId;

    @OneToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
    @JoinColumn(name = "REFRESH_TOKEN_ID")
    private RefreshToken refreshToken;

...setters and getters

И код для токена:

@Entity
@Table(name = "RefreshTokens")
public class RefreshToken {

    @Column(name = "REFRESH_TOKEN_ID")
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long tokenId;

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Если ваш RefreshToken имеет только 1 поле REFRESH_TOKEN_ID , что является длинным. Зачем вам разные таблицы для этого. Вы можете просто иметь что-то вроде этого

public class User {

    @Column(name = "USER_ID")
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Long userId;

    @Column(name = "REFRESH_TOKEN_ID")
    private Long refreshToken;

...

Когда вызывается setToken(), вы должны установить любое значение. Если да, то это так. Ваша логика будет работать нормально,

Если нет, вы всегда можете сгенерировать уникальное значение в Java на основе текущего времени или чего-либо еще.

или

Если вы хотите продолжить с той же скороговоркой, используйте orphanRemoval = true

@OneToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "REFRESH_TOKEN_ID")
private RefreshToken refreshToken;
0 голосов
/ 05 июля 2018

Вы никогда не должны изменять первичный ключ объекта

Это невозможно, поскольку вы меняете идентификатор токена. Вам нужно создать другой идентификатор в RefreshToken, который будет уникальным и останется неизменным после сохранения.

Если вам это действительно нужно - лучше удалить сущность и создать новую, которая просто копирует старую, но с новым первичным ключом.

...