Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA正删除由。。。在某些条件下不起作用_Java_Mysql_Spring_Hibernate_Spring Data Jpa - Fatal编程技术网

Java JPA正删除由。。。在某些条件下不起作用

Java JPA正删除由。。。在某些条件下不起作用,java,mysql,spring,hibernate,spring-data-jpa,Java,Mysql,Spring,Hibernate,Spring Data Jpa,我想做一个简单的基于时间的策略游戏。。。 这是数据库连接:王国(OneToMany)->进程、建筑、资源、部队 进展、建设、资源、队伍“> 如果我这样做: public void updateProgression(Kingdom kingdom) throws TroopNotFoundException, BuildingNotFoundException { List<ProgressionModel> progressions = kingdom.getKin

我想做一个简单的基于时间的策略游戏。。。 这是数据库连接:王国(OneToMany)->进程、建筑、资源、部队 进展、建设、资源、队伍“>

如果我这样做:

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);
            }
        }
   }
在控制台中休眠查询:

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内置查询来获取UpdateProgration方法中属于王国的所有进程:

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

我无法解决这个问题。当然,如果我使用repository调用来获取属于王国的进程,代码会起作用,但我真的不明白为什么deleteById没有做任何事情,即使我向它传递了一个有效的Id。谢谢你的帮助!我希望该组合足够好,可以理解。这是我的第一个任务顺便说一句,请给我一些建设性的批评。

你在JPA背后的行为上绊倒了

当您删除实体或以任何方式更新它时,JPA不会立即将更改写入数据库。 实际写入仅在刷新事件时发生,或者由于某些其他原因(如获取新创建实体的id)而有必要时发生

在以下情况下会触发刷新事件:

  • 交易结束
  • 如果查询数据库。 这是为了确保您在查询中看到更新的数据。 如果需要,还可以将其配置为不触发刷新
  • 如果在
    EntityManager
    上显式调用flush。如果使用Spring Data JPA,则可以使用

  • 没有引发任何异常吗?您是否尝试过删除(progressionModel)?恕我直言,先生,请在回答之前阅读我的问题。
    List<ProgressionModel> progressions = progressionModelRepository.findAllByProgressKingdom(kingdom);
    
    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=?