使用HibernateDaoSupport的LazyInitializationException

时间:2011-02-17 14:32:32

标签: hibernate spring

我正在尝试使用HibernateDaoSupport,但我遇到了org.hibernate.LazyInitializationException问题。

这是我想要做的一个例子;

public class MyDaoImpl extends HibernateDaoSupport {

    public Set<Long> getCoreItemIdsForCustomerIds(Set<Long> customerIds) {
        Set<Long> itemIds = new HashSet<Long>();
        for (Long customerId : customerIds) {
            Customer customer = getCustomerWithId(customerId);
            itemIds.addAll(getItemIdsFromItems(customer.getCoreItems()));
        }
        return itemIds;
    }

    private Customer getCustomerWithId(Long customerId) {
        return getHibernateTemplate().get(Customer.class, customerId);
    }

    private Set<Long> getItemIdsFromItems(Set<Item> items) {
        Set<Long> itemIds = new HashSet<Long>();
        for (Item item : items) {
            itemIds.add(item.getId());
        }
        return itemIds;
    }
}

客户拥有一系列商品。该实体是懒惰的,所以我猜问题是在 getCustomerWithId 完成会话关闭后,'customer'现在已经分离。因此,当调用 customer.getCoreItems()时,将抛出异常。

有没有人知道如何使用HibernateDaoSupport并保持会话打开,直到 getCoreItemIdsForCustomerIds 返回?

或者我是否需要自己手动启动和关闭交易才能执行此操作?

希望有道理!感谢。

1 个答案:

答案 0 :(得分:1)

使用OpenSessionInView过滤器。会话将在请求 - 响应呈现阶段持续开放。