我是Spring/JPA的新手,我正在尝试使用数据库关系@annotations来简化我的代码。
我有两个实体,一个用户实体和令牌实体。 当在用户上调用 setToken(( 时,我希望令牌覆盖表中与用户关联的任何旧令牌。
目前,新令牌(通过user.setToken(((正在插入而不是更新。
我该如何实现这种关系?在"跛脚的人"中...用户甚至只能拥有一个令牌,并且可以随时获得另一个令牌,丢弃旧的令牌。为了清楚起见,这些模型中有一些额外的字段被截断了。
@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;
如果您的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;
永远不要修改实体的主键
当您更改令牌的 ID 时,这是不可能的。您需要在 RefreshToken 中创建不同的 ID,该 ID 是唯一的,并且在保存后保持不变。
如果您确实需要它 - 您最好删除实体并创建一个新实体,该实体仅复制旧实体但具有新的主键。