java - 具有本机查询的存储库在测试环境中失败 - postgres、jpa、spring
问题描述
我已经使用测试容器为 spring boot 项目设置了集成测试(使用 postgresql 设置了一个 docker 实例)。如果我正在测试的存储库不使用本机查询,则测试效果很好。但是,每当存储库包含本机查询时,我都会收到以下错误:ERROR: relation "my_table_here" does not exist
. 如何让我的测试配置工作以允许本机查询?
下面是我的测试设置:
@RunWith(SpringRunner.class)
public class TestPostgresql {
@ClassRule
public static PostgreSQLContainer postgreSQLContainer = PostgresDbContainer.getInstance();
/**
* ************ REPOSITORIES ************
*/
@Autowired
NativeQueryRepository nativeQueryRepository;
@TestConfiguration
@EnableJpaAuditing
@EnableJpaRepositories(
basePackageClasses = {
NativeQueryRepository.class
})
@ComponentScan(
basePackages = {
"com.company.project.package.repository"
}
)
static class PostgresConfiguration {
/**
* ************ DATABASE SETUP ************
*/
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setUrl(postgreSQLContainer.getJdbcUrl());
dataSource.setUsername(postgreSQLContainer.getUsername());
dataSource.setPassword(postgreSQLContainer.getPassword());
return dataSource;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
HibernateJpaVendorAdapter vendorAdapter = new JpaVendorAdapter();
vendorAdapter.setDatabase(Database.POSTGRESQL);
vendorAdapter.setGenerateDdl(true);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan("com.company.project");
factory.setDataSource(dataSource());
return factory;
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory);
return txManager;
}
}
}
编辑:我相信这与命名策略有关?
有关更多上下文,这里是如何在存储库中使用 nativeQuery 的示例
@Repository
public interface NativeQueryRepository extends JpaRepository<NativeEvent, Long> {
@Modifying
@Transactional
@Query(value = "UPDATE native_event SET state = :state " +
"WHERE secondary_id = :secondaryId", nativeQuery = true)
void updateState(
@Param("state") String state,
@Param("secondaryId") String secondaryId);
}
TestPostgresql
我还尝试通过添加注释来更新内部静态类的 testProperties :
@TestPropertySource(properties = {
"spring.jpa.hibernate.naming-strategy=org.springframework.boot.orm.jpa.SpringNamingStrategy"
})
但是,收到的错误没有改变。
编辑:添加NativeEvent
:
@Entity
@Table(
name = "NativeEvent",
indexes = {
@Index(name = "idx_native_event_secondary_id", columnList = "secondaryId")
}
)
@EntityListeners(AuditingEntityListener.class)
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class NativeEvent implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name="secondaryId", nullable=false)
private String secondaryId;
@Column(name="state")
private String state;
}
解决方案
您可以像这样显式分配表名:
@Table(name = "NativeEvent")
但是在您的本机查询中,您对该表有不同的名称:
@Query(value = "UPDATE native_event ...)
从注释中删除name
属性@Table
(假设您的命名策略将产生类似native_event的名称)或将本机查询中的表名更改为nativeevent或nativeEvent因此在这种情况下只需删除下划线。
有点相关的帖子
推荐阅读
- xml - XSTL 电子邮件在 outlook.com 上显示完整链接
- android-activity - startup.ActivityLogin 泄露了最初添加在这里的窗口 DecorView@3a9e526[ActivityLogin]
- node.js - Angular 无法使用直接 url 打开页面,在 Node.js Express 服务器上运行
- database - 必须从原始 IP 地址完成安装,对不起 - Moodle
- regex - NGINX 是否支持 PCRE2 扩展替换处理?
- android - 将小部件保持在状态栏下方
- json - 我如何加入 2 个以上的 postgres 表并在 postgres 中将结果作为nestedjson
- git - 当它附加到 Docker 容器时,如何在 VS Code 中使用本地 git?
- python - 连续运行 C++ 代码和 Python 代码
- chef-infra - 从厨师工作站执行时的刀列表未列出我的厨师服务器