tento problém nastává pokud odpojíte session, s objekty dále pracujete a přistoupíte k nějakému prvku (obvykle další objekt v relaci) a session není k dispozici.
Máte tyto možnosti:
- načíst data před zavřením cache:
- musíte přistoupit ke všemu co chcete používat ještě před uzavřením session
- v service.findStock nepoužívat session.load, ale session.get. Session.load předpokládá, že objekt existuje a tak jej vůbec nenačítá (prostě vrátí CGLIB proxy, která objekt načte až při prvním přístupu). Toto je IMHO Váš přístup. Problém ale nastane při přístupu k něčemu v relaci,
- nepoužívat Lazy čtení - nedoporučuji - při prvním přístupu k objektu se načte všechno na co má relaci
- zavírat session až po na konci akce. Tj. váš service.findStockItemById() nebude vytvářet session, ale použije existující. U složitějších aplikací je lepší použít JTA prostředí (API pro obecné (a i distribuované) transakce)
S pozdravem
Petr Ferschmann
Petr Gola píše v So 13. 05. 2006 v 12:40 +0200:
Zdravim,
mam nasledujici klientsky kod komunikujici se spring aplikacni vrstvou
(pomoci Spring's HTTP Invoking).
public class MyTest {
public static void main(String[] args) {
System.out.println(args[0]);
XmlBeanFactory beanFactory = new XmlBeanFactory(new
FileSystemResource(args[0]));
IStockItemService service = (IStockItemService)
beanFactory.getBean("myservice");
System.out.println("find item by id 5:");
StockItem item = service.findStockItemById(5);
String str = null;
str = ""+item.getId();
// str += item.getDescription();
// str += ""+item.getPrice();
System.out.println(str);
System.out.println("added item:");
System.out.println(service.saveNewStockItem(new StockItem("Ahoj",29)));
System.out.println("all items:");
List list = service.getStockItemList(null);
for (Object o : list) System.out.println(o);
}
}
takhle probehne vse v poradku. Ale pokud se snazim zavolat metody
objektu item getDescription() ci getPrice(), vyskoci nasledujici
chybova hlaska:
find item by id 5:
(hibernate.LazyInitializationException 19 ) could not initialize
proxy - no Session
org.hibernate.LazyInitializationException: could not initialize proxy
- no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:53)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:98)
at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:158)
at com.gola.cobra.bo.StockItem$$EnhancerByCGLIB$$975d2856.getDescription(<generated>)
at com.gola.cobra.client.MyTest.main(MyTest.java:19)
Exception in thread "main" org.hibernate.LazyInitializationException:
could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:53)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:98)
at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:158)
at com.gola.cobra.bo.StockItem$$EnhancerByCGLIB$$975d2856.getDescription(<generated>)
at com.gola.cobra.client.MyTest.main(MyTest.java:19)
|
smime.p7s
Description: S/MIME cryptographic signature
