Точки останова отладчика влияют на сгенерированный SQL-запрос Hibernate - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь переместить подчиненную сущность C (деталь) из моей сущности A (проект) в сущность B (проект)

  1. Я помещаю подчиненную сущность C (деталь) во временную переменную
  2. установить пустую сущность C (подробности) для сущности A
  3. сохранить сущность A с помощью JpaRepository
  4. установить временные переменные данные в сущность B
  5. сохранить сущность B с помощью JpaRepository

Это работает правильно только тогда, когда я ставлю точку останова на шаге 3: сохраняем объект A с помощью JpaRepository.Я вижу, как удалить, а затем вставить запрос в окончательный журнал:

Hibernate: delete from project_details where project_id=? 
...
Hibernate: insert into project_details (project_id, details_id) values (?, ?)

, но без точки останова на шаге 3 Я просто потерял объект C (подробности) в обоих объектах (только удалить в журнале запросов) Как мне нужно исправитьчтобы правильно работать без точки останова?

    @Transactional
    public void moveProject(final AtomicReference<Project> projectRecipient, final Project projectMoved) {
        Project projectRecipientDB = projectRepository.findOne(projectRecipient.get().getId());
        Project projectMovedDB = projectRepository.findOne(projectMoved.getId());

        Set<ProjectDetail> projectDetailsCurrent = projectMovedDB.getDetails();
        projectMovedDB.setDetails(new HashSet<>());
        projectRepository.save(projectMovedDB); //breakpoint 
        projectRepository.flush();

        projectRecipientDB.setDetails(mergeSet(projectRecipientDB.getDetails(), projectDetailsCurrent));
        projectRepository.save(projectRecipientDB);
        projectRepository.flush();

    }

UPD: я как-то заставил этот код работать, я просто положил

Set<ProjectDetail> projectDetailsCurrent = projectMovedDB.getDetails(); 
Logger.getLogger(ProjectService.class.getName()).error("projectDetailsCurrent2 size = "+projectDetailsCurrent.size() ); 
projectMovedDB.setDetails(new HashSet<>());

работает не Возможно, у кого-то есть объяснениеспасибо

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

Работает с точкой останова, потому что подчиненный объект (деталь) подключается к основному объекту Project как:

@OneToMany(fetch = FetchType.LAZY) 
private Set<ProjectDetail> details = new HashSet<>(0);

Отладчик вызывает эти элементы и LAZY получает его из БД, без отладчика вы можете просто получить размер (только для заполнения этой переменной):

Set<ProjectDetail> projectDetailsCurrent = projectMovedDB.getDetails(); 
projectDetailsCurrent.size();
0 голосов
/ 03 мая 2019

У меня нет причины, почему у вас другое поведение с / без отладки, но:

  • Вы пытались сбросить только один раз в конце?
  • другой вариант должен вызывать projectRepository.clear () сразу после первого .flush ()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...