Hibernate Spring数据JPA C无法初始化代理-在.parallel()中的不同线程中运行时没有会话
当我试图并行运行这段代码并在MyObject上对一些道具进行惰性初始化时,我遇到了问题。无论哪个lambda未在主线程中运行,都将获得异常: 未能延迟初始化角色集合: my.package.model.I18String.translations,无法创建 初始化代理-无会话 如何使会话在每个lambda线程中可用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
@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无关)。JPAEntityManager
被定义为绑定到线程,这最终意味着实体的延迟加载状态也是如此
因此,要并行处理对象,您需要确保它们已完全初始化。理想情况下,您会触发返回不可变DTO的查询,以便实例在设计上是线程安全的。但是调用.findBy和访问延迟加载字段是在同一线程中发生的。在这种情况下,我有三个线程,每个线程都在调用findBy然后尝试在同一个线程中初始化关系,但它只在父线程中工作。有没有办法将会话绑定到spring boot app中的主线程以外的线程上?