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

Spring Data JPA-返回未来

李谦
2023-03-14

我试图异步保存实体并返回结果的未来,但我遇到了以下问题:

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.Repository;
import org.springframework.scheduling.annotation.Async;
//import org.springframework.stereotype.Repository;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future;

// I must extend Repository because when I extended JpaRepository an argument 
// of save is ambigous when I try save(countryEntity) - compiler shows me 
// save (CountryEntity) in AsyncCountryRepository and save (S) in CrudRepository
public interface AsyncCountryRepository extends Repository<CountryEntity, Long> {

    // I don't know why I cannot return Future<CountryEntity>
    @Async
    <S extends CountryEntity> Future<S> save(CountryEntity countryEntity);

    // I cannot test it - test is below
    @Async
    CompletableFuture<CountryEntity> findByCode(String code);

}


@RunWith(SpringRunner.class)
@DataJpaTest
public class CountryRepositoryTest {

    @Autowired
    private TestEntityManager entityManager;

    @Autowired
    private AsyncCountryRepository countryRepository;

    @Test
    public void findByCodeTest() throws Exception {
        // given
        final CountryEntity countryEntity = new CountryEntity("EN");

        final CountryEntity persisted = entityManager.persist(countryEntity);
        entityManager.flush();

        // when
        final Future<CountryEntity> byCode = countryRepository.findByCode(persisted.getCode());

        // then
        assertThat(byCode.get())
                .isEqualTo(persisted);
    }

测试返回失败,我得到预期结果:

如何将我的存储库实现为异步存储库以及如何测试它?

哪种方法性能更好:1。从存储库2返回未来。是否在ExecutorService中以可调用的方式运行存储库方法?

共有1个答案

茹正祥
2023-03-14

如果使用Async,存储库代码将在其自身事务中的单独线程中运行。由于您的原始事务没有提交,因此它不会看到更改(即插入的实体),因此结果为空。

因此,为了使其工作,您需要提交第一个事务。

关于性能的第二个问题(请下次单独提问):多线程代码的性能取决于很多事情,而回答这个问题的唯一有用方法是:尝试一下。但是,如果您安排执行的方式比线程池和连接池大小等因素对性能的影响更大,我会感到惊讶。

 类似资料:
  • 问题内容: 因此,当我打开灯箱时,我试图禁止在页面上滚动,而我发现这个确实有用的脚本非常有用。不幸的是,当我在自己的页面上使用它时,它也禁止在灯箱中滚动。我开始用警报调试代码,只是发现该事件。wheelDelta在我的页面上返回“undefined”,而在JSFiddle中,它返回-120。 问题答案: jQuery事件处理程序中的对象不能反映真实事件。是IE和Opera的非标准事件属性,可通过j

  • 我正在学习这个教程,它试图通过构建一个最小的JVM来最小化JVM内存占用。

  • 有很多使用OkHTTP3发出请求的例子,但是,我仍然无法发出正确的请求。据我所知,我的设置是正确的。 我不断收到如下所示的回复。我不知道他们是什么意思。 {“ContentLength”:238,“ContentTypeString”:“Application/JSON”,“Source”:{“Buffer”:{“Size”:0},“Closed”:False,“Source”:{“BytesRe

  • 问题内容: 我有以下简单的看法。为什么会导致此错误? 问题答案: 因为视图必须 返回 ,而不仅仅是调用它。将最后一行更改为

  • 我正在使用JUnit和Mockito库来测试我的应用程序。问题是,当我在代码下面执行时,值在运行时没有返回空列表,并且测试失败。理想情况下,当get执行时,它应该返回空列表 我热切期待着支持。有没有人能帮我一下,如何通过这个测试用例???。如何通过Mockito使第8行的控件通过测试用例??? 请假设,下面两个类没有真实的代码,我们只有二进制文件作为JAR文件,我们不能修改下面的代码....我附上

  • null 但在执行时 用户$mvn-版本 cli返回:程序'mvn'可以在以下包中找到: null 用户$echo$JAVA_HOME /usr/lib/jvm/java-8-Oracle