Hibernate @OneToOne однонаправленное отношение от "слабой" сущности - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть сущности 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), то когда я пытаюсь удалить пользователя, который не был активирован,это терпит неудачу из-за FK.

Чего мне здесь не хватает?

Спасибо.

1 Ответ

0 голосов
/ 21 ноября 2018

В таком случае вы должны объявить двунаправленную связь.Вы также должны указать @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.

...