Hibernate OneToOne关系删除子实体导致删除整个父实体行

Hibernate OneToOne关系删除子实体导致删除整个父实体行,hibernate,one-to-one,hibernate-cascade,Hibernate,One To One,Hibernate Cascade,我的申请有以下问题 定义: 我有三张桌子。用户、密码和确认令牌。用户表是父表。密码和确认令牌表是与用户表具有一对一关系的子表。用户和确认表ID作为外键存储在用户表中 问题: 当用户激活其帐户时,应将确认令牌行从确认令牌表中删除。因此,用户表中的列也应该被删除 我的成就: 在下面的方案中,当我删除确认令牌时,整个用户行数据也会被删除,但密码行数据不会被删除。我想要的是,当删除确认令牌时,只应删除用户表中相应的行和外键列 public class User { @Id @GeneratedVa

我的申请有以下问题

定义: 我有三张桌子。用户、密码和确认令牌。用户表是父表。密码和确认令牌表是与用户表具有一对一关系的子表。用户和确认表ID作为外键存储在用户表中

问题:

当用户激活其帐户时,应将确认令牌行从确认令牌表中删除。因此,用户表中的列也应该被删除

我的成就: 在下面的方案中,当我删除确认令牌时,整个用户行数据也会被删除,但密码行数据不会被删除。我想要的是,当删除确认令牌时,只应删除用户表中相应的行和外键列

public class User {

 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 private int userId;

 private String username;
 private String email;
 private UserStatus status;
 private LocalDateTime registerDate;
 private LocalDateTime lastLoginDate;

 @OneToOne(fetch = FetchType.LAZY)
 @JoinColumn(name = "PASSWORD_ID", referencedColumnName = "passwordId")
 private UserPasswords userPassword;

 @OneToOne(fetch = FetchType.LAZY)
 @JoinColumn(name = "ACCOUNT_CONFIRMATION_TOKEN_ID")
 private ConfirmationToken confirmationToken;}



@Entity
public class ConfirmationToken {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int tokenId;
private String confirmationToken;
private LocalDateTime creationDate;

  @OneToOne(fetch = FetchType.LAZY, mappedBy = "confirmationToken",cascade=CascadeType.REMOVE,     optional=true)
  private User user;
}


这是因为设置了
cascade=CascadeType.REMOVE
。这将设置在删除相应的
确认令牌
行时删除
用户
实体

不能使用DELETE语句仅删除列的值。这只能通过UPDATE语句完成。删除将始终删除整行

要实现所需的功能,可以通过将
@JoinColumn
注释移动到
确认令牌
实体中的映射,将连接列移动到
确认令牌
表中。在这里:

@OneToOne(fetch = FetchType.LAZY, mappedBy = "confirmationToken", optional=true)
@JoinColumn(name = "ACCOUNT_CONFIRMATION_TOKEN_ID")
private User user;

这会将要删除的列移动到将删除整行的表中。这完全不需要更新语句。

嘿,谢谢你的快速评论。这是否意味着我应该获取用户实例并将确认令牌id外键设置为null,然后使用crud interface提供的确认令牌存储库接口删除确认令牌实例如果您仍然希望采用这种方法,是的。然后,您将执行两条SQL语句,我不确定,但我认为您需要为用户调用save()作为额外的代码行。对于更好的方法,您还有其他建议吗?关于管理这种关系?因此,每个用户在注册到站点时都会有一个确认令牌。通过邮件激活后,应删除此令牌。所以我所做的就是将外键放入users表中,并执行上面所写的操作
@OneToOne(fetch = FetchType.LAZY, mappedBy = "confirmationToken", optional=true)
@JoinColumn(name = "ACCOUNT_CONFIRMATION_TOKEN_ID")
private User user;