从“弱”实体休眠@OneToOne单向关系

时间:2018-11-21 00:42:48

标签: hibernate jpa cascading-deletes

我有一个User和ActivationKey实体。 ActivationKey实体是指在创建用户时创建的User实体,一旦用户访问了已发送到其电子邮件的链接,就会将其删除。

public class User implements Serializable {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    ...
}

public class ActivationKey {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "user_id")
    private Usuario usuario;

    ...
}

问题是:当我删除激活密钥时,用户也会因为级联而被删除。

有没有一种方法可以避免这种情况,但是可以保持自动删除的另一种方式,这意味着,如果删除的用户尚未被激活,则会在删除用户之前自动删除相应的ActivationKey(由于FK) ?

如果我删除(cascade = CascadeType.ALL),则当我尝试删除尚未激活的User时,由于FK导致失败。

我在这里想念什么?

谢谢。

1 个答案:

答案 0 :(得分:0)

在这种情况下,您应该声明双向关系。您还应该在@OneToOne类中将User指定为:

@OneToOne(cascade = CascadeType.ALL, orphanRemoval=true,mappedBy="usuario")
private ActivationKey activationKey;

在这里,您基本上是在指定UserActivationKey的父实体,并且您要为User上的每个操作指定对ActivationKey的相同操作,而反之亦然(可能取决于ActivationKey中的级联类型)。 mappedBy属性指定在子实体中,您可以通过该属性的值找到父实体的实例。

ActivationKey类中,删除cascade类型:

 @OneToOne
 @JoinColumn(name = "user_id")
 private Usuario usuario;

在这里,由于您没有提及任何级联类型,因此,仅在ActivationKey 上执行的操作不会对父User对象产生任何影响。