如何级联删除单向

时间:2019-07-15 21:21:04

标签: spring hibernate hibernate-cascade

在某些情况下,我有一个用户,并且该用户有一个EmailVerificationToken

我想在删除用户后删除EmailVerificationToken。

但是,由于EmailVerificationToken是一个仅需要很短时间(即仅使用一次且之后不相关)的对象,所以我不需要User实体包含令牌。相反,我希望EmailVerificationToken引用它所属的用户,而不是相反。

如何设置它,以便在删除用户时,即使在User实体中未引用它,它也会删除EmailToken?

这是我当前拥有的代码:

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;
}

1 个答案:

答案 0 :(得分:0)

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

您需要在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"; 

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

然后在事务方法中,您将在其中删除用户,首先删除令牌;

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是实体管理器的实例。

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