【问题标题】:JPA OneToOne UPDATE instead of INSERTJPA OneToOne 更新而不是插入
【发布时间】:2018-07-05 13:21:47
【问题描述】:

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

我有两个实体,一个用户和令牌实体。 当对用户调用 setToken() 时,我希望 Token 覆盖表中与用户关联的任何旧令牌。

目前,新令牌(通过 user.setToken())正在 INSERT 而不是 UPDATE。

我该如何建立这种关系?在“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;

【问题讨论】:

    标签: spring spring-boot jpa hibernate-annotations


    【解决方案1】:

    如果您的 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;
    

    【讨论】:

    • 抱歉,我截断了代码。用户和令牌都有各种带有 getter/setter 的 String/Long/Boolean 字段。我将编辑我的帖子。
    • 在这种情况下,您可以使用选项 2 orphanRemoval = true
    【解决方案2】:

    永远不要修改实体的主键

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 2011-07-03
      • 1970-01-01
      • 2020-01-09
      • 2016-09-12
      相关资源
      最近更新 更多