JPA OneToOne UPDATE而不是INSERT

时间:2018-07-05 13:21:47

标签: spring spring-boot jpa hibernate-annotations

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

我有两个实体,一个用户实体和一个令牌实体。 在用户上调用setToken()时,我希望Token覆盖表中与该用户相关联的所有旧令牌。

目前,新令牌(通过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 :(得分:1)

如果您的$route='http://localhost:8000/api/devices'; try { $device= new Client(); $answer= $client->request('GET', $answer); $body = $answer->getBody(); $status = 'true'; $message = 'Data found!'; $final= json_decode($body); foreach ($finala $res) { $id = $res->clientId; } echo $id; 只有1个字段, REFRESH_TOKEN_ID 很长。为什么需要为此使用不同的表。您可以拥有这样的东西

RefreshToken

调用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; ... 时,您必须设置任何值。如果是的话。您的逻辑会很好,

如果否,您总是可以根据当前时间或其他方式在Java中生成唯一值。

如果要继续使用相同的模式,请使用setToken()

orphanRemoval = true

答案 1 :(得分:0)

您永远不应修改实体的主键

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

如果您确实需要-最好删除该实体并创建一个新实体,该实体只是复制旧实体,但要使用新的主键。