Zdravím,

treba si uvedomiť, že existuje HttpSession a ešte HibernateSession. Síce nepoužívam
OpenSessionInViewInterceptor ale OpenSessionInViewFilter, ale zrejme to bude podobné. Pri použití toho filtra má HibernateSession životnosť 1 request (pri interceptore to bude zrejme 1 bean, čo je asi ešte kratšie), potom zaniká. Takže po vložení toho objektu do HttpSession a ukončení requestu sa objekt dostane do stavu detached a preto už nie je možný lazy fetch. Po vytiahnutí z HttpSession ho treba dostať do stavu persistent v aktuálnej HiberanteSession napr. príkazom session.refresh(houseUser).

Rastislav "Bedo" Siekel



Ing. Rastislav Siekel
Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia
E-mail : <[EMAIL PROTECTED]>
Tel : 041/562 54 91
Fax : 041/562 54 97
Mobil : 0905 34 00 20


Ivan Polák wrote:
Zdravim konferenciu,

prestudoval som si vsetky minule otazky v konferencii na temu lazy loading, ale na postacujucu odpoved som nenarazil.
jedna sa o web aplikaciu, pouzivam Spring 2.5, Spring MVC, Acegi 1.0.6 a Hibernate 3.2, DB je postgreSQL.
mam 2 objekty, napr. object House a objekt HouseUser.

public class HouseUser extends BaseObject implements UserDetails {

   @Id
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="seq_house_user")
   private Long id;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
   @JoinColumn(name = "fk_house_id", referencedColumnName = "id", nullable = false)
   private House house;

   ...
}

public class House extends BaseObject {

   @Id
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="seq_house")
   private Long id;

   private String name = null;

@OneToMany(mappedBy = "house", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
   @JoinColumn(name = "fk_house_id")
   private List<HouseUser> houseUsers;

   ....
}

teda je tam spojenie z House na HouseUser 1:N a spojenie HouseUser na House 1:N.

kedze sa jedna o web aplikaciu, pre open session pouzivam presne podla manualu Interceptor:

<beans>
   <bean name="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
       <property name="sessionFactory">
           <ref bean="sessionFactory"/>
       </property>
       <property name="singleSession">
           <value>false</value>
       </property>
   </bean>
</beans>

po kode:

objekt House mam ulozeny v HttpSession, ziskavam ho z Acegi:

HouseUser houseUser = (HouseUser) (SecurityContextHolder.getContext().getAuthentication().getPrincipal());

Long id = houseUser.getHouse().getId();            // <-- na tomto riadku

teda akokeby tam nebol "dotiahnuty" objekt House v objekt HouseUser.

dostavam chybu:

2008-01-12 22:04:11,235 ERROR LazyInitializationException - could not initialize proxy - no Session
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
   at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57)
   at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
   at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150)
....

nemali ste niekto podobny problem ? je skutocne jedine mozne riesenie nepouzit LAZY loading ?

dakujem

Ivan


Odpovedet emailem