我有一个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导致失败。
我在这里想念什么?
谢谢。
答案 0 :(得分:0)
在这种情况下,您应该声明双向关系。您还应该在@OneToOne
类中将User
指定为:
@OneToOne(cascade = CascadeType.ALL, orphanRemoval=true,mappedBy="usuario")
private ActivationKey activationKey;
在这里,您基本上是在指定User
是ActivationKey
的父实体,并且您要为User
上的每个操作指定对ActivationKey
的相同操作,而反之亦然(可能取决于ActivationKey
中的级联类型)。 mappedBy
属性指定在子实体中,您可以通过该属性的值找到父实体的实例。
在ActivationKey
类中,删除cascade
类型:
@OneToOne
@JoinColumn(name = "user_id")
private Usuario usuario;
在这里,由于您没有提及任何级联类型,因此,仅在ActivationKey
上执行的操作不会对父User
对象产生任何影响。