【问题标题】:Hibernate @OneToOne unidirectional relation from "weak" entity来自“弱”实体的休眠 @OneToOne 单向关系
【发布时间】:2018-11-21 00:42:47
【问题描述】:

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

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),那么当我尝试删除尚未激活的用户时,它会因为 FK 而失败。

我在这里错过了什么?

谢谢。

【问题讨论】:

    标签: hibernate jpa cascading-deletes


    【解决方案1】:

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

    @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对象产生任何影响。

    【讨论】:

    • 那么就没有办法避免双向关系了吗?一旦用户被激活,它就没什么用了。
    • 按照你提到的场景,我认为没有其他解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多