JUnit5 问题:实体已创建却无法通过自定义方法检索
问题排查与解决
1. 查询方法命名不符合Spring Data JPA规则
你定义的findCreateGameByPublisherId方法命名存在问题,Spring Data JPA的查询方法命名有固定规则:前缀(find/get/read)+ 条件(By+字段名),中间的CreateGame属于多余的干扰词,Spring Data无法正确解析该方法对应的查询逻辑,导致生成的SQL不符合预期,自然查不到数据。
解决办法:将方法名修改为符合规则的格式,例如:
Game findByPublisherId(String publisherId);
2. 测试场景下的事务提交问题
如果你的测试类未配置事务,尽管Spring Data JPA的save方法默认会立即执行插入操作,但部分内存数据库(如H2)在测试环境中可能需要显式提交事务,才能查询到新插入的数据。
解决办法:
在测试方法上添加@Transactional和@Commit注解,确保事务提交:
@DisplayName("Test for createGame") @Test @Transactional @Commit public void createGameTest(){ // 你的测试代码逻辑 }
3. 实体主键与映射配置问题
检查Game实体类的配置:
- 主键字段是否添加了
@Id注解?你继承的是JpaRepository<Game, String>,主键类型为String,需要确保实体中对应的字段(比如gameDataId)标记了@Id注解。 publisherId字段是否正确映射到数据库表的对应列?虽然Spring Data默认会自动将驼峰命名转为下划线列名,但仍需确认实体字段与数据库列名无匹配错误。
示例正确的实体配置:
@Entity public class Game { @Id private String gameDataId; private String publisherId; private String name; private Long timePlayed; // 省略getter、setter及构造方法 }
内容的提问来源于stack exchange,提问作者dcm50
相关产品推荐
相关产品推荐

