JPA OneToOne UPDATE 而不是 INSERT

JPA OneToOne UPDATE instead of INSERT

我是 Spring/JPA 的新手,我正在尝试使用数据库关系 @annotations 来简化我的代码。

我有两个实体,一个是用户实体,一个是令牌实体。 当对用户调用 setToken() 时,我希望令牌覆盖 table.

中与用户关联的任何旧令牌

目前,新令牌(通过 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;

永远不要修改实体的主键

这是不可能的,因为您更改了令牌的 ID。您需要在 RefreshToken 中创建一个不同的 ID,该 ID 是唯一的并且在保存后保持不变。

如果您确实需要它 - 您最好删除该实体并创建一个新实体,该实体仅复制旧实体但具有新的主键。

如果您的 RefreshToken 只有 1 个长字段 REFRESH_TOKEN_ID。为什么为此需要不同的 table。你可以有这样的东西

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;