我在 SpringBoot 应用程序中有以下测试用例,并带有提到的数据源配置
@DataJpaTest
@ComponentScan(#service package)
@ContextConfiguration(classes = DataSourceConfiguration.class)
public class IdTest{
@Autowired
private EntityManager entityManager;
@Autowired
private MyRespository myRepository;
@Autowired
private ProcessorService processorService;
@Autowired
private DataSource dataSource;
@Autowired
private JdbcTemplate jdbcTemplate;
MyObject myObject;
@Test
void injectedComponentsAreNotNull() {
assertNotNull(dataSource);
assertNotNull(jdbcTemplate);
assertNotNull(entityManager);
assertNotNull(myRepository);
}
@Test
@Transactional
public void invalidId() throws Exception {
String resource = "/invalid/invalidId.xml";
myObject= new MyObject();
modifyPrivateField(myObject, "id", readFileToByteArray(resource));
modifyPrivateField(myObject, "name", resource);
MyObject mySavedObject = myRepository.save(myObject);
ProcessingResult rsult = processorService.process(mySavedObject.getId());
assertNotNull(rsult);
assertEquals(ProcessingResult.ErrorCode.ILLEGAL_FORMAT_MANDATE_ID, rsult.getErrorCode());
assertEquals(1, rsult.getVars().length);
assertEquals("3805213", rsult.getVars()[0]);
}
}
DataSourceConfiguration.java
@Configuration
@EnableJpaRepositories(basePackages = {
"#service package" }, entityManagerFactoryRef = "DataSourceEntityManagerFactory", transactionManagerRef = "transactionManager")
public class DataSourceConfiguration {
@Value("${my.driverClassName}")
private String driver;
@Value("${my.url}")
private String url;
@Value("${my.username}")
private String username;
@Value("${my.password}")
private String password;
@Value("${my.dialect}")
private String dialect;
@Bean
public DataSource unittestDataSource() {
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.driverClassName(driver);
dataSourceBuilder.url(url);
dataSourceBuilder.username(username);
dataSourceBuilder.password(password);
return dataSourceBuilder.build();
}
@Bean
public LocalContainerEntityManagerFactoryBean DataSourceEntityManagerFactory(
@Qualifier("unittestDataSource") DataSource datasource) {
EntityManagerFactoryBuilder builder = new EntityManagerFactoryBuilder(new HibernateJpaVendorAdapter(),
new HashMap(), null);
Builder factoryBuilder = builder.dataSource(datasource);
factoryBuilder.packages("#service package");
factoryBuilder.persistenceUnit("PU-unittest");
factoryBuilder.jta(false);
Map<String, String> additionalProperties = new HashMap<>();
additionalProperties.put("hibernate.dialect", dialect);
factoryBuilder.properties(additionalProperties);
return factoryBuilder.build();
}
}
application.yml
my:
dialect: org.hibernate.dialect.Oracle10gDialect
driverClassName: org.h2.Driver
url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=ORACLE;DATABASE_TO_UPPER=false
username: sa
password:
spring:
jpa:
hibernate:
ddl-auto: create-drop
当我配置oracle数据库时,测试用例执行没有任何错误。但是,当我配置 H2 数据库(如上所述)时,我收到错误
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "select PAS_CIO_SEQ1.nextval from[*] dual"; expected "identifier"; SQL statement: select PAS_CIO_SEQ1.nextval from dual [42001-200]
我在这里缺少什么?如何解决这个问题?
注意:我尝试过多种方言(Oracle、Oracle10g、h2 等)。
我想说的是序列丢失了。验证它是否已创建,并尝试不使用
DATABASE_TO_UPPER=false
,以防 nextval 列的大小写出现问题...