LazyInitializationException в сервисе Spring - PullRequest
0 голосов
/ 14 июня 2011

Я разрабатываю приложение в Spring 3.0.5 и Hibernate 3.6.2, и в настоящее время я работаю в контроллере JSON, но у меня есть это исключение, и я не могу понять, почему это происходит.Я проверял ранее в SO и Google, но эта проблема довольно странная.Итак, вот мой код:

Контроллер

@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).В логах есть открытая сессия и транзакция.Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 14 июня 2011

Не могли бы вы опубликовать точное исключение, которое вы получили?

Вы находитесь в транзакции в строке dev.getProperties(), но не в транзакции, в которую была загружена dev.Вам нужно либо заново присоединить его, либо организовать вызов dev.getProperties(), пока вы еще находитесь в транзакции, которая его загрузила, или переместить границу транзакции вверх, чтобы оба вызова были в одной транзакции, или изменить конфигурацию Hibernate так,что properties загружается не лениво, или измените код, который загружает dev, чтобы он извлекал properties в HQL.

Какой из этих вариантов будет применяться к вам, зависит от вашей ситуации, но я бы начал с последнего.

1 голос
/ 14 июня 2011

Похоже, ваша транзакция создана после прочтения Device dev.Попробуйте прочитать / перечитать его внутри транзакции, чтобы увидеть, что происходит.

...