2010-05-11 3 views
2

J'ai un service REST exposé via Spring-MVC. J'ai une méthode particulière qui est correctement mappée et appelée via un appel HTTP. Mon application Spring contient le HibernateTransactionManager et les transactions sont configurées via @Transactional -annotations. J'annotés la méthode comme ceci:LazyInitializationException avec l'annotation @Transactional dans MessageConverter

@Transactional(readOnly = true) 
@Override 
@RequestMapping(value = "/start", method = RequestMethod.GET) 
@ResponseBody 
public List<SomeObject> start(....) 

Chaque fois que j'appelle la méthode HTTP I un org.hibernate.LazyInitializationException de mon org.springframework.http.converter.json.MappingJacksonHttpMessageConverter qui est lié dans mon contexte d'application. L'annotation @Transactional est-elle également valide pour le MessageConverter?

Répondre

2

Votre classe convertisseur est évidemment la lecture d'un champ qui est configuré pour être collecté paresseusement dans votre configuration Hibernate

Deux solutions possibles:

  • Développez votre méthode transactionnelle pour inclure la méthode du convertisseur.
  • Modifiez votre configuration Hibernate pour extraire avec impatience le champ responsable du LazyInitializationException. (Ce champ peut par exemple faire partie d'une relation entre deux tables dans la base de données.)
+0

J'ai déjà résolu mon problème en faisant ce qui était votre première proposition. En fait, le problème était qu'un autre outil que j'ai utilisé pour mapper des objets, a copié persistbags au lieu des collections réelles ... – Karl

+1

Iam face au même problème ici, S'il vous plaît, comment avez-vous cela? Comment avez-vous développé votre méthode transactionnelle? –

2

LazyInitializationException signifie que votre hibernation Session est fermée au moment où vous essayez de lire des données non initialisées sur votre entité.

Vous pouvez résoudre ce problème par:

  • soit l'extension de la durée de la session (en utilisant OpenSessionInView
  • pré-initialiser l'entité dans votre méthode de service, en utilisant Hibernate.initialize(entity)
Questions connexes