gpt4 book ai didi

java - 静态方法中的 LazyInitializationException

转载 作者:行者123 更新时间:2023-12-01 13:00:00 24 4
gpt4 key购买 nike

JPA session 在静态方法中的行为如何?我使用 Hibernate 从数据库中检索对象列表,然后使用 Guava 的静态 Lists.transform 方法对其进行转换,这会导致:

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

在检索延迟初始化的属性时,即使所有操作都是在一个事务中完成的。静态方法中是否存在 JPA session ?

示例如下:

@Stateless
public class OrderDaoBean {

@PersistenceContext(unitName = "pu")
private EntityManager em;

public List<OrderDTO> getAllOrders() {
List<Order> ordersList = em.createNamedQuery("Orders", Order.class).getResultList();
return Lists.transform(ordersList, new Function<Order, OrderDTO>() {
@Override
public OrderDTO apply(Order order) {
return new OrderDTO(order.getId(), order.getItems().size());
}
});
}
}

最佳答案

这与静态方法无关。问题在于 Lists.transform() 返回的列表不是包含 DTO 的新列表。这是a view on the original list ,根据需要延迟地转换元素。

因此,当您开始从此列表中获取元素时,实际上会在事务结束后调用转换函数。

您应该简单地创建转换后的列表的副本:

return Lists.newArrayList(Lists.tranform(...));

关于java - 静态方法中的 LazyInitializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23580485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com