我找到了一种非常简单的方法,即如何创建一个视图而不必自动创建由 JPA 管理的所有表以及实体实例化。
基本上我让 spring boot 启动并创建所有表。这包括创建一个与 JPA 实体所需视图同名的表。
启动后,我只需删除表,然后在 sql 脚本中创建自己的视图。
它工作得很好,实体在表被删除后继续使用视图,因为它们都有相同的名称。
这是一些代码:
public class StartUpRunner implements CommandLineRunner {
public static final String VIEW_INIT_FILE = "after_hibernate_init.sql";
@Autowired
private DataSource dataSource;
@Override
public void run(String... arg) throws Exception {
createSQLViews();
}
private void createSQLViews(){
boolean IGNORE_FAILED_DROPS = true;
ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator(false, IGNORE_FAILED_DROPS , "UTF-8", new ClassPathResource(VIEW_INIT_FILE));
resourceDatabasePopulator.execute(dataSource);
}
}
在sql文件中应该有这样的东西:
DROP TABLE IF exists YOUR_VIEW_NAME;
CREATE OR REPLACE View YOUR_VIEW_NAME
//Your view creation statement here....
将标志“ignore failed drops”设置为 true 非常重要,因为在第一次启动后,视图将已经存在并且 sql 脚本在 drop tables 语句上失败,这将关闭应用程序。这样SpringBoot会忽略失败的语句,正常启动。
这种方法的缺点是您不能再使用 @DataJpaTest 测试视图,因为 StartUpRunner 需要创建视图。至少如果你像我一样使用 SpringBoot 的嵌入式 H2 数据库,它需要在每个测试类之前进行初始化。
我用于测试视图的测试注释如下所示:
@ActiveProfiles("sqltest")
@ExtendWith(SpringExtension.class)
@SpringBootTest
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
我正在使用 testMethodOrder 因为 sql 插入的数据在每次测试后不再被清除,我只在第一次测试之前插入数据并在所有测试中使用它。
activeProfiles 注释应该是相对不言自明的。我在那里指定测试 H2 数据库和其他应用程序特定设置。
关于如何将视图压缩到 JPA 的自动创建功能中,请随时询问有关此方法的更多信息。