【发布时间】:2019-11-24 14:31:38
【问题描述】:
我有一个案例,我有一个用户,而该用户有一个 EmailVerificationToken。
当用户被删除时,我想删除EmailVerificationToken。
但是,由于EmailVerificationToken 是一个仅在短时间内需要的对象(即只使用一次并且之后无关紧要),我不希望User 实体包含令牌。相反,我希望 EmailVerificationToken 引用它所属的用户,而不是相反。
如何设置它,以便当我删除用户时,它会删除 EmailToken,即使它没有在 User 实体中引用它?
这是我目前的代码:
public class EmailVerificationToken implements IEntity, IDto {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "emailVerificationTokenId")
private Long id;
@OneToOne
@JoinColumn(name = "userId", nullable = false)
private User user;
}
和
public class User implements IEntity, IDto, UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "userId")
private Long id;
}
【问题讨论】:
-
看来你想在删除子项时删除父项。不过,我建议不要这样做,而是将 EmailVerificationToken 放在 User 类中。您可以将其设置为延迟加载,并将其保留为带有 mappedBy 属性的双向映射,以指定映射将出现在 EmailVerificationAttribute 表中。但是,如果您只想继续使用这种方法,您可以在数据库中编写一个触发器来处理这个问题。您也可以使用 JPA 监听器,但再次在监听器中获取实体管理器将是不可行的。
-
@AkshayKhopkar 如果最好让它保持延迟加载,我会这样做并将问题标记为已回答。谢谢
-
这不是关于最佳实践,而是关于更好的时间性能,因为您可能不需要每次获取用户时使用 EmailVerificationToken。
-
@AkshayKhopkar 计划是在验证电子邮件后删除令牌,所以我质疑为什么我需要在用户对象中引用令牌,因为验证后该字段将永远为空(验证发生得很快)
-
因为拥有令牌的用户更能反映现实世界的用例,而不是相反。
标签: spring hibernate hibernate-cascade