2011-06-14 3 views
0

Spring 3.0.5 및 Hibernate 3.6.2에서 응용 프로그램을 개발 중이며 현재 JSON 컨트롤러에서 작업하고 있지만이 예외가 있으며 왜 그런 일이 발생하는지 이해할 수 없습니다. 이전에 SO와 Google에서 확인했지만이 문제는 아주 이상합니다.Spring 서비스의 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

정확한 예외를 게시 할 수 있습니까?

행의 거래는 dev.getProperties()이고, 거래는 dev이 아닙니다. 다시 연결하거나,로드 된 트랜잭션 중에 여전히 dev.getProperties()을 호출하거나 두 트랜잭션이 같은 트랜잭션에 있도록 트랜잭션 경계를 위로 이동하거나 최대 절전 모드 구성을 변경하여 properties 게으른로드가 아니거나로드하는 코드를 dev으로 변경하여 HQL에서 properties을 가져옵니다.

귀하에게 해당되는 옵션은 상황에 따라 다르지만 마지막 옵션부터 선택하겠습니다.

+0

답변 해 주셔서 감사합니다. 예외가 던져 질 org.hibernate.LazyInitializationException, 귀하의 게시물을 몇 가지 개념을 명확히하기 때문에 전체 스택 추적을 게시하지 및 그 결과로 내가 서비스 메서드의 논리를 수정합니다 모든 내부에서 수행됩니다 있도록 동일한 거래. – Jairo

1

Device dev 읽은 후에 거래가 생성 된 것으로 보입니다. 트랜잭션 내에서 읽기/다시 읽기를 시도하여 어떤 일이 발생하는지 확인하십시오.

+0

답변을 주셔서 감사합니다. 확실히 "device"의 로딩 메소드 내부에서 getProperties 메소드를 호출하는 것은 설계상의 잘못이었습니다. 올바르게 작동하지만, 서비스 메소드가 모든 단일 페치를 수행하도록 수정합니다. – Jairo