JPA会话在静态方法中的行为如何?我正在使用Hibernate从数据库中检索对象列表,然后使用Guava的静态Lists.transform
方法对其进行转换,这会导致:
org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话
在检索延迟初始化属性时,即使所有操作都在一个事务中完成。 JPA会话是否存在于静态方法中?
以下是示例:
@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());
}
});
}
}
答案 0 :(得分:1)
这与静态方法无关。问题是Lists.transform()
返回的列表不是包含DTO的新列表。它是a view on the original list,可以根据需要懒洋洋地转换元素。
因此,当事务结束后,当你开始从这个列表中获取元素时,实际上会调用转换函数。
您只需创建转换后列表的副本:
return Lists.newArrayList(Lists.tranform(...));