Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate Spring数据JPA C无法初始化代理-在.parallel()中的不同线程中运行时没有会话_Hibernate_Jpa_Spring Data Jpa_Spring Data - Fatal编程技术网

Hibernate Spring数据JPA C无法初始化代理-在.parallel()中的不同线程中运行时没有会话

Hibernate Spring数据JPA C无法初始化代理-在.parallel()中的不同线程中运行时没有会话,hibernate,jpa,spring-data-jpa,spring-data,Hibernate,Jpa,Spring Data Jpa,Spring Data,当我试图并行运行这段代码并在MyObject上对一些道具进行惰性初始化时,我遇到了问题。无论哪个lambda未在主线程中运行,都将获得异常: 未能延迟初始化角色集合: my.package.model.I18String.translations,无法创建 初始化代理-无会话 如何使会话在每个lambda线程中可用 @Service public class MyService { @Autowired private JpaRepo1 repo1; @Autowired pr

当我试图并行运行这段代码并在MyObject上对一些道具进行惰性初始化时,我遇到了问题。无论哪个lambda未在主线程中运行,都将获得异常:

未能延迟初始化角色集合: my.package.model.I18String.translations,无法创建 初始化代理-无会话

如何使会话在每个lambda线程中可用

@Service
public class MyService {

  @Autowired
  private JpaRepo1 repo1;
  @Autowired
  private JpaRepo2 repo2;


  public List<Result> find(String param1, Long param2, Locale param3) {
    return Stream.of(
        findResults1(query, webGroupId, lang),
        findResults2(query, webGroupId, lang))
        **.parallel()**
        .map(Supplier::get)
        .flatMap(Collection::stream)
        .collect(toList());
  }

  private Supplier<List<Result>> findResults1(String param1, Long param2, Locale param3) {
    return () -> repo1.findByNameContains(param1, param2, param3)
        .stream()
        .map(cat -> toResult(cat, param3))
        .collect(toList());
  }

  private Supplier<List<Result>> findResults2(String param1, Long param2, Locale param3) {
    return () -> repo2.findByNameContains(param1, param2, param3)
        .stream()
        .map(pg -> toResult(pg, param2, param3))
        .collect(toList());
  }
  private Result toResult(MyObject obj, Locale lang) {
    SearchResult result = new SearchResult();
    result.setResultId(obj.getId());
    **result.setResultName(obj.getName().getString(lang));** // <=====
    result.setTags(obj.getTags().stream().map(Tag::getId).collect(toList()));
    return result;
  }
@服务
公共类MyService{
@自动连线
私人JpaRepo1报告1;
@自动连线
私人JpaRepo2报告2;
公共列表查找(字符串参数1、长参数2、区域设置参数3){
回流(
findResults1(查询、webGroupId、lang),
findResults2(查询、webGroupId、lang))
**.parallel()**
.map(供应商::获取)
.flatMap(集合::流)
.collect(toList());
}
私有供应商findResults1(字符串参数1、长参数2、区域设置参数3){
return()->repo1.findByNameContains(param1、param2、param3)
.stream()
.map(cat->toResult(cat,param3))
.collect(toList());
}
私有供应商findResults2(字符串参数1、长参数2、区域设置参数3){
return()->repo2.findByNameContains(param1、param2、param3)
.stream()
.map(pg->toResult(pg,param2,param3))
.collect(toList());
}
私有结果到结果(MyObject对象,语言环境lang){
SearchResult=新的SearchResult();
result.setResultId(obj.getId());

**result.setResultName(obj.getName().getString(lang));***/您所看到的是按照JPA规范设计的(读取:与此处涉及的Spring数据JPA无关)。JPA
EntityManager
被定义为绑定到线程,这最终意味着实体的延迟加载状态也是如此


因此,要并行处理对象,您需要确保它们已完全初始化。理想情况下,您会触发返回不可变DTO的查询,以便实例在设计上是线程安全的。

但是调用.findBy和访问延迟加载字段是在同一线程中发生的。在这种情况下,我有三个线程,每个线程都在调用findBy然后尝试在同一个线程中初始化关系,但它只在父线程中工作。有没有办法将会话绑定到spring boot app中的主线程以外的线程上?