Applet + Hibernate

0

Mam do napisania aplikację z wykorzystaniem Hibernate'a, w wersji okienkowej aplikacja działa, do projektu dodałem klasę Applet, która jak można się domyślić zawartość okienka ma wyświetlać na stronie jako aplet. Uruchamianie klasy Applet z NetBeans 6.9.1 generuje prawidłowy podgląd, tj. wyświetla się to samo co w okienku ale jako aplet. Problem polega na tym, że jednocześnie generuje mi się w katalogu /build plik html, ale jego odpalenie wywołuje pojawienie się w konsoli następującego komunikatu:

 Exception in thread "thread applet-praca/Applet.class-1" java.lang.NoClassDefFoundError: org/hibernate/Session
	at praca.Applet.init(Applet.java:22)
	at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.hibernate.Session
	at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
	at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source)
	at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
	at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	... 3 more
Caused by: java.io.FileNotFoundException: C:\Users\Mistic\Documents\NetBeansProjects\praca\build\classes\org\hibernate\Session.class (System nie może odnaleźć określonej ścieżki)
	at java.io.FileInputStream.open(Native Method)
	at java.io.FileInputStream.<init>(Unknown Source)
	at java.io.FileInputStream.<init>(Unknown Source)
	at sun.net.www.protocol.file.FileURLConnection.connect(Unknown Source)
	at sun.net.www.protocol.file.FileURLConnection.getInputStream(Unknown Source)
	at sun.plugin2.applet.Applet2ClassLoader.getBytes(Unknown Source)
	at sun.plugin2.applet.Applet2ClassLoader.access$000(Unknown Source)
	at sun.plugin2.applet.Applet2ClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	... 8 more

Pliki Hibernate'a pochodzą z wersji 3.6.0.
Nie bardzo rozumiem co się dzieje bo z NetBeansa wygląda to normalnie, a odpalając applet przez plik .html otrzymuję powyższy błąd. W Properties->Libraries->Compile mam dodane następujące pliki .jar:

hibernate3.jar
antlr-2.7.6.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
javassist-3.12.0.GA.jar
jta-1.1.jar
slf4j-api-1.6.1.jar
0

Exception in thread "thread applet-praca/Applet.class-1" java.lang.NoClassDefFoundError: org/hibernate/Session

Caused by: java.io.FileNotFoundException: C:\Users\Mistic\Documents\NetBeansProjects\praca\build\classes\org\hibernate\Session.class (System nie może odnaleźć określonej ścieżki)

404

0

No tak, tylko jak ja mam to teraz skonfigurować skoro w wersji okienkowej i podglądzie apleta w NetBeansie wszystko działa.

0

Katalog build służy do odpalania spod NetBeansa tak w wielkim skrócie :P
Samodzielne paczki z reguły lądują w folderze dist. Zobacz czy tam czegoś nie ma.

0

W katalogu /dist wygenerowało mi inny plik .html - launch.html, ten za to wywala mi takie błędy:

Initial SessionFactory creation failed.java.security.AccessControlException: access denied (java.util.PropertyPermission hibernate.enable_specj_proprietary_syntax read)
Exception in thread "thread applet-praca.Applet-1" java.lang.ExceptionInInitializerError
	at praca.HibernateUtil.<clinit>(HibernateUtil.java:28)
	at praca.PanelGlowny.<init>(PanelGlowny.java:49)
	at praca.Applet.init(Applet.java:22)
	at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.security.AccessControlException: access denied (java.util.PropertyPermission hibernate.enable_specj_proprietary_syntax read)
	at java.security.AccessControlContext.checkPermission(Unknown Source)
	at java.security.AccessController.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkPropertyAccess(Unknown Source)
	at java.lang.System.getProperty(Unknown Source)
	at org.hibernate.cfg.Configuration.reset(Configuration.java:362)
	at org.hibernate.cfg.Configuration.<init>(Configuration.java:296)
	at org.hibernate.cfg.Configuration.<init>(Configuration.java:300)
	at org.hibernate.cfg.AnnotationConfiguration.<init>(AnnotationConfiguration.java:74)
	at praca.HibernateUtil.<clinit>(HibernateUtil.java:24)
	... 4 more
0

Aplety mają ograniczone prawa dostępu ze względu na potencjalne próby włamania do kompa za pomocą np ukrytego apletu. Nie wiem czy w ogóle dałoby się odpalić Hibernata spod apletu.

A tak w ogóle to co to za pomysł odpalania Hibernata z apletu? Aplet jest zwykle klientem, a Hibernate odpala się po stronie serwera.

0

Nie wiem czemu wpadłem na pomysł zrobienia swojego projektu w formie appletu. Możliwe, że po prostu trzymam się kurczowo pierwszego pomysłu jaki przyszedł mi do głowy.
Moja aplikacja ma umożliwiać logowanie się do "systemu" i wykonywanie różnych działań z wykorzystaniem Hibernate'a zależnie od tego na jakiego typu konto się zaloguję. W jakiej formie najlepiej to zrobić, żebym mógł to wrzucić na stronę internetową i to sobie działało skoro wersja z Appletem poszła do kosza?

0

hmmm według mnie kolega Wibowit ma rację. Działania z użyciem hibernata powinny być robione po stronie serwera, a Ty jak sądzę połączyłeś sobie serwer i klient w jedno. Myślę że powinieneś użyć napisanego już kodu do stworzenia serwera i napisać klienta w formie apletu . Do tego musisz napisać jakiś interfejs porozumiewania się klienta z serwerem np: klient łączy się z serwerem i wysyła żądanie zalogowania, serwer za pomocą hibernata łączy się z baza i sprawdza czy podane dane są ok itd.

0

a nie powinno się po prostu podpisać cyfrowo apletu? JDBC wtedy działa normalnie więc czemu hibernate nie będzie mógł? Hibernate nie wymaga jakiegoś specjalnego kontenera a jedynie Java SE.

0

@paweln1986, hibernate może działać w ramach JSE, ale trzeba wtedy samodzielnie zarządzać m.n. stanem sesji. Podpisanie apletu niewiele da ponieważ Hibernate wykorzystuje trochę dodatkowych elementów np. stara się pisać do logu. Do tego tworzy dynamicznie klasy (proxy) co też nie za bardzo jest możliwe w apletach.

@Mithrandium, proponuję trochą inne podejścia:

  1. Niech aplet będzie tylko UI, a na serwerze umieść aplikację EE, której usługi będziesz wywoływał z apletu. Warunek. Musisz mieć serwer EE.
  2. Zamiast apletu użyj Java Web Start (http://en.wikipedia.org/wiki/Java_Web_Start) jest to rozwiązanie pośrednie pomiędzy Apletem, a aplikacją okienkową. Ma inny model bezpieczeństwa, a tym samym znacznie łatwiej jest wykonać pewne czynności np. wywołanie bazy danych.

Na koniec przemyśl dokładnie jak masz zamiar serwować hibernateowi dane do połączenia. Jeżeli gdzieś po stronie klienta zaszyjesz zestaw user+hasło+adres bazy lub będziesz je wysyłał via sieć to nie będzie to dobre rozwiązanie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1