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;
我是 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;