2013-04-11 17 views
9

Mam metodę o następującej strukturze:Grails Gorm: Nie można zainicjować serwera proxy - nie Session

public void run(){ 
    ... 
    for (...) { //this part works correct 

     User.withTransaction { 
      User user = User.findByUsername(...); 

      Position pos = Position.findByName(...) 
      if(pos){ ... 
      } else { ... 
       try{ 
        pos.save(flush:true); 
        user.position = pos; 
       } catch (Exception e){ ... } 
      } 
      ... 
      try{ 
       user.save(flush:true, failOnError: true); 
      } catch (Exception e){ ... } 
     } 
    } 
    //this part doesn't work 
    User.findAll().each { 
    ... 
     if (...){ 
      User.withTransaction{ 
       ... 
       //here the operation fails with 
       //org.hibernate.LazyInitializationException: 
       //could not initialize proxy - no Session 
       if (!userDetailsMap.containsKey(it.username) 
         && it.userStatus != blocked){ 
        it.userStatus = blocked 
        it.save(flush:true) 
       } 
      } 
     } 
    } 
} 

Wyjątkiem Dostaję Oto org.hibernate.LazyInitializationException: could not initialize proxy - no Session w drugiej części mojego kodu. Tutaj pole userStatus jest odniesieniem do innej klasy domeny.

Próbowałem dodać it.refresh() i Hibernate.initialize(it) do kodu, zanim właściwości zostaną zaznaczone, ale bezużyteczne. Co ja tu robię źle?

UPD: Próbowałem wywołać metodę it.attach przed właściwości są sprawdzane, ale tuż po metody zadzwonić wartość it.attached jest false.

+0

Czy wywołujesz tę metodę w widoku? –

+0

@ SérgioMichels, nie, ta metoda jest wywoływana przez harmonogram. Zadanie jest dodawane do programu planującego, który wywołuje metodę "run()". – svz

Odpowiedz

18

Nie sądzę, że robisz coś "niewłaściwego", po prostu obiekt został odłączony od sesji hibernacji. Kilka rzeczy bym spróbować:

+0

Próbowałem już dodać linię 'it.attach()', ale bez powodzenia. Spróbuję drugiej opcji. – svz

+0

Dziwne jest to, że zaraz po wywołaniu 'it.attach()' wartość 'it.attached' jest fałszywa. – svz

+2

Pomógł wreszcie związek między klasami domen, które nie były leniwe, ale uważam, że nie jest to najlepsze rozwiązanie. Jednak do tej pory to jedyny. – svz

0

Wystąpił ten sam dokładny błąd, gdy używałem subdomen klasy w jednej klasie, jeśli rozmiar danych jest większy niż rozmiar strony, pojawi się błąd "Wiadomość: nie można zainicjować proxy - bez sesji "

przez usi ng <> lazy: false, hibernacja poprawnie użyje załącznika sesji i wyświetli odpowiednie dane.

Dziękuję za ten wpis. Udało mi się rozwiązać mój błąd.

0

Thomas Farvour wskazał właściwy kierunek. Dokumenty, 13.1.1 Wycofywanie transakcji i sesja, sugerują chętne pobieranie dzieci jako optymalnego rozwiązania.

Powiązane problemy