JPA: связанные записи не удаляются - PullRequest
0 голосов
/ 11 мая 2018

У меня проблема с дизайном базы данных

Существует сущность Пользователь

public class User implements UserDetails, Serializable {

    // ...

    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "MANAGER_ID")
    private Manager manager;

    // ...

}

Есть связанная сущность Менеджер , связанная с Пользователь объект

public class Manager {

    // ...

    @OneToMany(mappedBy = "manager", orphanRemoval = true)
    @LazyCollection(LazyCollectionOption.FALSE)
    private List<ExpertAndRequest> requests;

    @OneToOne(mappedBy = "manager", orphanRemoval = true)
    private User user;


    @OneToMany(mappedBy = "manager")
    private List<ParticipantRequest> participantRequests;


    // ...

}

Объект ExpertAndRequest представляет собой таблицу связей «многие ко многим» между Manager и ParticipantRequest объект

public class ExpertAndRequest implements Serializable {

    // ...

    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "managerId", updatable = false, insertable = false, referencedColumnName = "id")
    private Manager manager;


    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "requestId", updatable = false, insertable = false, referencedColumnName = "id")
    private ParticipantRequest request;

    // ...

}


public class ParticipantRequest {

    // ...

    @OneToMany(mappedBy = "request", cascade = CascadeType.ALL)
    @LazyCollection(LazyCollectionOption.FALSE)
    private List<ExpertAndRequest> experts;

    @ManyToOne
    @JoinColumn(name = "manager_id")
    private Manager manager;

    // ...

}

при удалении менеджера

this.managerRepository.delete(manager);
this.managerRepository.flush();

Я ожидаю удаления ExpertAndRequest строк с правым Manager и связанных Пользователь .Но этого не происходит, и появляется ошибка

org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : my.package.name.model.Manager.user -> my.package.name.model.User

Что я делаю не так?Спасибо!


ОБНОВЛЕНИЕ Это все, что я делаю перед удалением.Ничего, кроме удаления

public ManagerApiResult deleteManager(@RequestParam(name = "id") Long id) {
    if(!this.isUserManager()) {
        return null;
    }

    ManagerApiResult res = new ManagerApiResult();

    Manager manager = this.managerRepository.findOne(id);

    if(manager == null) {
        res.errors.add(String.format("Manager id \"%s\" do not exist", id));
        return res;
    }
    this.managerRepository.delete(manager);
    this.managerRepository.flush();
    return res;
}

1 Ответ

0 голосов
/ 11 мая 2018

Исключение самоочевидно

Где-то в вашем графе сущностей (пользователь менеджера) у вас есть экземпляр User, который не был persisted до удаления manager

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...