当前位置: 首页 > 知识库问答 >
问题:

如何在Spring Boot项目中联调数据库视图

卫劲
2023-03-14

我有一个表和视图,并为这些创建了相应的JPA。我想同时查看表和视图。

 -- account table
 CREATE TABLE account(
      user_id serial PRIMARY KEY,
      username VARCHAR (50) UNIQUE NOT NULL,
      password VARCHAR (50) NOT NULL,
      email VARCHAR (355) UNIQUE NOT NULL,
      created_on TIMESTAMP NOT NULL,
      last_login TIMESTAMP
   );
-- account view
create view account_view as
        select user_id, email, last_login from account;

我添加了一个联调。它适用于表,但是视图没有任何数据。

如何确保在基表中插入行时,视图也会在集成测试中得到更新?我可能缺少一些配置。如何在集成测试期间添加视图定义?

@DataJpaTest
public class AccountRepositoryIntegTest {

    @Autowired
    AccountRepository accountRepository;

    @Autowired
    AccountViewRepository accountViewRepository;

    @Test
    public void testFindByUserid(){
        Account account = Account.builder()
                .email("abc@gmail.com")
                .username("abc")
                .password("abc")
                .createdOn(new Date())
                .lastLogin(new Date())
                .build();
        Account persistedAccount = accountRepository.save(account);

        Account fetchedAccount = accountRepository.getOne(persistedAccount.getUserId());
        List<AccountView> accountViews = accountViewRepository.findAll();
        assertThat("view has data", accountViews.size(), is(Matchers.greaterThan(0)));
        assertThat(fetchedAccount.getUserId(), is(equalTo(persistedAccount.getUserId())));

    }
}

共有1个答案

许琛
2023-03-14

作为@marek。kapowicki表示,JPA将该观点视为表。这一点帮助我解决了问题。

当应用程序运行时,视图数据由数据库服务器填充。因此,视图的存储库正在尝试选择查询,它将获取数据。

但是,在联调期间,表是根据实体的定义创建的。视图也将作为没有视图定义的表创建。因此,每当您将数据保存在父表中时,视图都不会更新。

解决此问题的两种方法:

  1. 在运行集成测试之前,使用sql脚本创建所有表。这样您就可以定义视图,并且该脚本将用于设置数据库
  2. 为视图创建仅用于测试的自定义实体和存储库。创建自定义类以处理父表上的存储库操作,并且每当父表中有DML更改时,请确保根据视图定义更新视图实体。这样,父表和视图表将同步

我继续使用第二种方法,它对我很有效。我没有尝试第一种方法,但它应该有效。

 类似资料:
  • 我正在获取库项目中Examid字符串的空值。

  • 我正在编写一个android聊天应用程序,并试图使用自定义FirebaceRecyclerAdapter在RecyRCleView中使用Firebase数据库实现无休止的滚动。对于第一个消息加载,我使用对数据排序的查询从Firebase数据库获取数据。orderByChild()和。limitToFirst(specificCount)到目前为止还不错。但当用户滚动到最后一个可见项时,我必须获取消

  • 正如您在标题中可能已经看到或可能还没有看到的那样,我试图找出如何在我的库中使用spring数据,以及如何在我的其他项目中使用这个库。(并非所有基于web的应用程序只是为了澄清) 我试着回答这个问题好几天了,也许我只是看起来错了,就Spring而言,我是一个完全的初学者。 它只在启动时显示错误。 在这里找到项目https://gitlab.com/roboflax/Spring-Data-In-Li

  • 我的activity代码 请帮助我如何删除在Android Studio中连接数据库的列表视图中的项目。这是我的代码: 道:

  • 我在SprintBoot 2上配置了一个DB连接(HikariCP)。我在application.properties中定义了poolName: 我想监控空闲的数据库连接的数量,所以我试图创建一个线程来监控数据库连接: } 但我得到一个例外,它无法找到poolName HikariConnectionPool的实例。关于如何获得HikariCP管理的空闲DB连接,有什么建议吗? 进一步分析,我可以

  • 问题内容: 我正在尝试为视图创建JPA实体。在数据库层中,表和视图应该相同。 但是,问题开始出现并且有两个方面: 尝试设置正确的注释时。视图没有与之关联的主键,但是如果没有对字段进行适当的注释,则会在运行时引发抛出异常。 Spring Boot 接口定义要求类型为extends ,这避免了由于视图实体上缺少ID 而不能用作替代方法。 与缺少主键的视图进行交互的正确JPA / SpringBoot