静态方法中的LazyInitializationException

时间:2014-05-10 11:29:10

标签: java hibernate jpa ejb

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());
                }
            });
        }
    }

1 个答案:

答案 0 :(得分:1)

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

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

您只需创建转换后列表的副本:

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