JpaRespository deleteBy ... не работает в определенных условиях - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь сделать простую стратегическую игру, основанную на времени ... Это соединение с базой данных: kingdom (OneToMany) -> прогресс, строительство, ресурс, отряд image progression, building, resource, troop">

Если я это сделаюthis:

public void updateProgression(Kingdom kingdom) throws TroopNotFoundException, BuildingNotFoundException {
        List<ProgressionModel> progressions = kingdom.getKingdomsProgresses();
        for (ProgressionModel p : progressions) {
            System.out.println(p.getId());
            System.out.println(p.getType());
            System.out.println(p.getGameObjectId());
            System.out.println(p.getProgressKingdom().getId());
            if (timeService.timeIsUp(p)) {
                progress(p, kingdom);
            }
        }
   }
    private void progress(ProgressionModel progressionModel, Kingdom kingdom) throws TroopNotFoundException,
            BuildingNotFoundException {
        if (progressionModel.getGameObjectId() == null) {
            if (progressionModel.getType().equals("TROOP")) {
                troopService.createTroop(kingdom);
                progressionModelRepository.deleteById(progressionModel.getId());
                return;
            }
            buildingService.createBuilding(progressionModel, kingdom);
            System.out.println(progressionModel.getId());
            progressionModelRepository.deleteById(progressionModel.getId());
            return;

Запросы Hibernate в консоли:

Hibernate: select kingdomspr0_.kingdom_id as kingdom_5_3_0_, kingdomspr0_.id as id1_3_0_, kingdomspr0_.id as id1_3_1_, kingdomspr0_.game_object_id as game_obj2_3_1_, kingdomspr0_.kingdom_id as kingdom_5_3_1_, kingdomspr0_.time_to_progress as time_to_3_3_1_, kingdomspr0_.type as type4_3_1_ from progression kingdomspr0_ where kingdomspr0_.kingdom_id=?
1
FARM
null
1
Hibernate: select kingdomsre0_.kingdom_id as kingdom_7_4_0_, kingdomsre0_.id as id2_4_0_, kingdomsre0_.id as id2_4_1_, kingdomsre0_.amount as amount3_4_1_, kingdomsre0_.resource_per_minute as resource4_4_1_, kingdomsre0_.kingdom_id as kingdom_7_4_1_, kingdomsre0_.type as type5_4_1_, kingdomsre0_.updated_at as updated_6_4_1_, kingdomsre0_.dtype as dtype1_4_1_ from resources kingdomsre0_ where kingdomsre0_.kingdom_id=?
Hibernate: update resources set amount=?, resource_per_minute=?, kingdom_id=?, type=?, updated_at=? where id=?
Hibernate: insert into buildings (hp, kingdom_id, level, type) values (?, ?, ?, 'Farm')
1

Это не удалит прогрессию ...

Но если я позвонюВстроенный в JpaRepository запрос для получения всех прогрессий, принадлежащих королевству, в методе updateProgression:

List<ProgressionModel> progressions = progressionModelRepository.findAllByProgressKingdom(kingdom);

Затем hibernate удаляет прогрессию из таблицы прогрессий (чего я хочу добиться в первом сценарии):

Hibernate: select progressio0_.id as id1_3_, progressio0_.game_object_id as game_obj2_3_, progressio0_.kingdom_id as kingdom_5_3_, progressio0_.time_to_progress as time_to_3_3_, progressio0_.type as type4_3_ from progression progressio0_ where progressio0_.kingdom_id=?
1
FARM
null
1
Hibernate: select kingdomsre0_.kingdom_id as kingdom_7_4_0_, kingdomsre0_.id as id2_4_0_, kingdomsre0_.id as id2_4_1_, kingdomsre0_.amount as amount3_4_1_, kingdomsre0_.resource_per_minute as resource4_4_1_, kingdomsre0_.kingdom_id as kingdom_7_4_1_, kingdomsre0_.type as type5_4_1_, kingdomsre0_.updated_at as updated_6_4_1_, kingdomsre0_.dtype as dtype1_4_1_ from resources kingdomsre0_ where kingdomsre0_.kingdom_id=?
Hibernate: update resources set amount=?, resource_per_minute=?, kingdom_id=?, type=?, updated_at=? where id=?
Hibernate: insert into buildings (hp, kingdom_id, level, type) values (?, ?, ?, 'Farm')
1
Hibernate: delete from progression where id=?

Я не могу разобраться с этой проблемой.Конечно, код работает, если я использую вызов репозитория, чтобы получить прогрессии, принадлежащие королевству, но я действительно не понимаю, почему deleteById ничего не делает, даже если я передаю ему действительный идентификатор.Спасибо за помощь!Я надеюсь, что композиция достаточно хороша, чтобы понять.Это мой первый вопрос о StackOverflow, поэтому, пожалуйста, поразите меня конструктивной критикой.

1 Ответ

0 голосов
/ 19 февраля 2019

Вы запутались в поведении JPA при обратной записи.

Когда вы удаляете сущность или обновляете ее любым способом, JPA сразу не записывает изменения в базу данных.Фактическая запись происходит только при событии сброса, или если это необходимо по какой-то другой причине, например, при получении идентификатора для вновь созданного объекта.

События сброса запускаются в следующих ситуациях:

  1. Транзакция заканчивается.
  2. Если вы запрашиваете базу данных.Это делается для того, чтобы вы видели обновленные данные в своем запросе.Его также можно настроить так, чтобы он не вызывал сброс, если вы хотите.
  3. Если вы явно вызываете сброс на EntityManager.Если вы используете Spring Data JPA, это можно сделать с помощью JpaRepository и вызова flush() для него .
...