Spring JPA 存储库可以保存,但在 findBy 后抛出“找不到表”错误

问题描述 投票:0回答:1

我有一个像这样的 Spring Boot 测试:

@SpringBootTest
@AutoConfigureMockMvc(addFilters = false)
@Transactional
public class MyIntegrationTests {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private UserRepository userRepository;
    ...

    @BeforeEach
    public void init() {
        // Mockito mocks
        User u = new User();
        u.setName("test");
        userRepository.save(u);
    }

    @Test
    void myTest() {
        mockMvc.call to controller
    }
}

我将

@Transactional
添加到测试类中,否则
save()
将在
init()
方法中失败。

控制器调用一个服务

ServiceA
,该服务最终调用另一个服务
ServiceB
,而该服务又调用
userRepository.findUserById(userId)

但是这个调用会抛出异常:

o.h.engine.jdbc.spi.SqlExceptionHelper:找不到表“用户” 未找到表“人”; SQL语句:insert into user(created_at, user_field1、user_field2、user_field3) 值 (?, ?, ?, ?) [42102-200] 无法准备声明; SQL [插入用户(created_at, 用户字段1、用户字段2、用户字段3)值(?, ?, ?, ?)];嵌套的 异常是 org.hibernate.exception.SQLGrammarException:不能 准备声明

这是为什么呢?测试方法注释为

@Transactional
。我尝试将
@Transactional
添加到调用存储库的
ServiceB
的方法中,但同样的错误。

spring-boot jpa spring-data-jpa transactions spring-transactions
1个回答
0
投票

该服务调用 userRepository。findUserById(userId)。

但是这个调用会抛出异常:

o.h.engine.jdbc.spi.SqlExceptionHelper:找不到表“用户”表 未找到“人”; SQL语句:insert into user(created_at, user_field1、user_field2、user_field3) 值 (?, ?, ?, ?) [42102-200] 无法准备声明; SQL [插入用户(created_at, 用户字段1、用户字段2、用户字段3)值(?, ?, ?, ?)];嵌套的 异常是 org.hibernate.exception.SQLGrammarException:不能 准备声明

你的问题不正确。该错误不会从

userRepository.findUserById(userId)
弹出,因为这不会触发插入 sql 查询。可能是
userRepository.save
触发了此错误。

检查是否以及如何扫描您的实体和存储库以正确配置数据库。

© www.soinside.com 2019 - 2024. All rights reserved.