繁体   English   中英

多线程抛出 org.hibernate.LazyInitializationException:无法初始化代理 - 否 Session

[英]Multithreading throws org.hibernate.LazyInitializationException: could not initialize proxy - no Session

当我尝试在此服务中使用多线程(如果我按顺序运行程序没问题)时,我不断收到此错误:

@Service
@RequiredArgsConstructor
public class Service {

    private final Repository repository;

    public List<A> getAs(String[] ids) {
        List<A> as = Collections.synchronizedList(new ArrayList<>());

        List<CompletableFuture<Boolean>> futures = new ArrayList<>();
        for (String id : ids) {
            futures.add(CompletableFuture.supplyAsync(() -> repository.findById(id).orElse(null)).thenApply(as::add));
        }

        futures.forEach(CompletableFuture::join);

        return as;
    }

}

Repository是一个标准的JpaRepository<A, String>A

public class A {

    @Id
    @Column(name = "id")
    private String id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "b")
    private B b;

}

在返回列表的任何元素上执行A#getB时抛出错误

因为 B 是延迟加载的。

  1. 您可以在事务中创建此部分并添加初始化查询:
repository.findById(id).map(v -> {v.getB(); return v;}).orElse(null))
  1. 或者您可以使用 create not lazy 查询:
public interface ARepository extends JpaRepository<A, String> { 
    @Query(value = "SELECT c FROM A c LEFT JOIN FETCH c.b where c.id = :id")   
    A findById(@Param("id") String id);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM