【问题标题】:How to cascade delete unidirectional如何级联删除单向
【发布时间】: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


【解决方案1】:

我猜你有一个处理用户删除的事务服务。

您需要在您的 EmailVerificationToken 类中添加一个命名查询。类似的东西

@NamedQuery(name = EmailVerificationToken.FIND_BY_USER, query = "Select e from EmailVerificationToken e where e.user =:user"), 同时在类中为查询名称添加一个常量,例如:

public static final String FIND_BY_USER = "EmailVerificationToken.FindByUser"; 

然后您需要定义一个服务,该服务使用给定的用户实例查找令牌类的托管实例。

然后在要删除用户的事务方法中,首先删除令牌;

public void deleteUser(User user){
EmailVerificationToken token = someService.findByUser(user); //you get a 
//managed instance using the previously defined query
em.remove(token);
em.remove(user);

}

em 是实体管理器的一个实例。

希望这对您有所帮助。如有任何其他问题,您可以随时提问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多