2011-06-14 77 views
0

我在Spring 3.0.5开发应用程序和Hibernate 3.6.2,目前我在一个JSON控制器我工作,但我有此异常,我无法理解为什么发生。我以前在SO和Google中检查过,但这个问题很奇怪。因此,这里是我的代码:LazyInitializationException中在春季服务

控制器

@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; 
} 

}

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

回答

1

你能后你得到了确切的例外呢?

您在 a交易在dev.getProperties()线,但不是加载dev的交易。您可能需要重新安装它,或安排dev.getProperties()被称为当你还在加载它的交易,或移动事务边界起来,使两个呼叫是在同一交易或更改Hibernate的配置,使properties是不是延迟加载,或更改加载dev,使其在HQL获取properties的代码。

其中的这些选项将适用于你要看你的情况,但我会用最后一个开始。

+0

感谢您的回答。抛出的异常是org.hibernate.LazyInitializationException,我不发布整个堆栈跟踪,因为你的帖子澄清了一些概念,并因此我将修改服务方法中的逻辑,以确保所有内容都将在内部完成同一笔交易。 – Jairo 2011-06-14 21:54:03

1

貌似Device dev被读取后,将创建您的交易。尝试在事务中读取/重读它以查看会发生什么。

+0

感谢您的回答,当然这是一个设计错误,在“设备”的加载方法中调用getProperties方法它工作得很好,我将修改服务方法以在单个事务中执行所有提取操作。 – Jairo 2011-06-14 21:47:23