Spring服务中的LazyInitializationException

时间:2011-06-14 18:52:22

标签: java hibernate spring-mvc lazy-loading

我正在开发Spring 3.0.5和Hibernate 3.6.2中的应用程序,目前我正在使用JSON控制器,但我有这个例外,我无法理解为什么会发生这种情况。我以前在SO和谷歌检查过,但这个问题很奇怪。所以这是我的代码:

控制器

@RequestMapping(value = "/props", method = RequestMethod.GET)
public @ResponseBody 
List<Property> getJsonProps(String id) {        
    if(id==null)return null;
    Device dev = deviceService.getDispositivo(Long.parseLong(id));
    List<Property> props = deviceService.listProperties(dev, 10);
    return props;
}

设备服务

@Service("manageDevices")
@Transactional(readOnly=true,propagation=Propagation.REQUIRED)
public class ManageDevicesImpl implements ManageDevices {

private Logger log = LoggerFactory.getLogger(getClass());

@Autowired
private DevicesDAO devicesDAO; 


    public List<Property> listProperties(Device dev, Integer qty) {
    List<Property> props =  devicesDAO.pickProperties(dev, qty);
    return props; 
    }
}

DAO

@Repository("devicesDAO")
public class DevicesDAOImpl implements DevicesDAO {
private Logger log = LoggerFactory.getLogger(getClass()); 

@Autowired
private SessionFactory sessionFactory;

public List<Property> pickProperties(Device dev, Integer qty) {
    if(qty >= 0){           
        log.debug("Open? "+ sessionFactory.getCurrentSession().isOpen());
        log.debug("Tx Active? " + sessionFactory.getCurrentSession().getTransaction().isActive());
        List<Property> props = dev.getProperties();
        if(props != null){
            if(props.size() >= qty)
                return props.subList(0, qty-1);
            else
                return props;
        }
    }
    return null;
}

}

在我尝试加载属性(getProperties)的行中,pickProperties函数(DAO层)中发生异常。在日志中,有一个打开的会话和事务。提前谢谢。

2 个答案:

答案 0 :(得分:1)

看起来您的事务是在读取Device dev后创建的。尝试在事务中阅读/重读它,看看会发生什么。

答案 1 :(得分:1)

你能发布你得到的确切例外吗?

您在dev.getProperties()行的 a 交易中,但未加载dev的交易。您需要重新附加它,或安排在您仍在加载它的事务中调用dev.getProperties(),或者将事务边界向上移动以便两个调用都在同一个事务中,或者更改Hibernate配置,以便properties不会延迟加载,或更改加载dev的代码,以便它在HQL中获取properties

哪些选项适用于您取决于您​​的情况,但我会从最后一个开始。