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
|