Aplikacja składa się z następujących projektów:
- web - Spring DM web bundle
- domain - obiekty domeny wykorzystywane przez moduł web oraz moduł api, korzysta z hsqlbd oraz commons dbcp
- api - definiuje interfejs- kontrakt między warstwą web a warstwą dao
- dao - implementuję interfejs zdefiniowany przez moduł api, dostarcza implementacji usługi OSGI
- No PAR deployment- aplikacja składa się z luźno wrzucanych bundli.
- konfiguracja ORM określona za pomocą annotacji JPA (AnnotationSessionFactoryBean):
- dao
Manifest-Version: 1.0
jak się można było spodziewać, importujemy bundle Hibernate
Bundle-Version: 1.0.0
Bundle-Name: HibernateTest_dao Bundle
Bundle-ManifestVersion: 2
Bundle-SymbolicName: foo.bar.HibernateTest_dao
Import-Package: foo.bar.dao.api,
foo.bar.domain,
javax.sql;version="[0.0.0,0.0.0]"
Import-Bundle: com.springsource.org.apache.commons.dbcp,
com.springsource.org.hsqldb,
com.springsource.org.hibernate;version="[3.2.6.ga,3.2.6.ga]"
Import-Library: org.springframework.spring.instrumented - domain
Manifest-Version: 1.0
Bundle-Version: 1.0.0
Bundle-Name: HibernateTest_domain Bundle
Bundle-ManifestVersion: 2
Bundle-SymbolicName: foo.bar.HibernateTest_domain
Export-Package: foo.bar.domain;version="1.0.0"
Import-Bundle: com.springsource.javax.persistence;version="[1.0.0,1.0.0]",
com.springsource.org.hibernate;version="[3.2.6.ga,3.2.6.ga]"
pomimo, że nie używamy annotacji Hibernate (a jedynie JPA) bundle Hibernate musi zostac zaimportowany - w przeciwnym przypadku przy starcie bundle dao dostaniemy wyjątek: java.lang.NoClassDefFoundError: org/hibernate/proxy/HibernateProxy
- dao
- konfiguracja ORM określona w plikach konfiguracyjnych xml (LocalSessionFactoryBean):
- dao
Manifest-Version: 1.0
bez zmian
Bundle-Version: 1.0.0
Bundle-Name: HibernateTest_dao Bundle
Bundle-ManifestVersion: 2
Bundle-SymbolicName: foo.bar.HibernateTest_dao
Import-Package: foo.bar.dao.api,
foo.bar.domain,
javax.sql;version="[0.0.0,0.0.0]"
Import-Bundle: com.springsource.org.apache.commons.dbcp,
com.springsource.org.hsqldb,
com.springsource.org.hibernate;version="[3.2.6.ga,3.2.6.ga]"
Import-Library: org.springframework.spring.instrumented - domain
Manifest-Version: 1.0
tym razem bundle domain nie potrzebuje żadnego importu: ani JPA ani Hibernate
Bundle-Version: 1.0.0
Bundle-Name: HibernateTest_domain Bundle
Bundle-ManifestVersion: 2
Bundle-SymbolicName: foo.bar.HibernateTest_domain
Export-Package: foo.bar.domain;version="1.0.0"
- dao
Manifest-Version: 1.0
Web-DispatcherServletUrlPatterns: *.html
Module-Type: Web
Bundle-Version: 1.0.0
Bundle-Name: HibernateTest_web Bundle
Bundle-ManifestVersion: 2
Web-ContextPath: HibernateTest
Bundle-SymbolicName: foo.bar.HibernateTest_web
Import-Package: foo.bar.dao.api,
foo.bar.domain;version="[1.0.0,1.0.0]"
Import-Bundle: com.springsource.org.apache.taglibs.standard;version="[1.1.2,1.1.2]",
com.springsource.org.hibernate;version="[3.2.6.ga,3.2.6.ga]"
Import-Library: org.springframework.spring.instrumented
W innym przypadku, przy próbie wykonania zapytania HQL zobaczymy: org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken. Hibernate ładuję cześć klas za pomocą Thread context classloadera, czyli w naszym przypadku za pomocą ClassLoadera, który załadował moduł web. Najciekawsze jest to, że zapytania korzystające z Criteria API, operacje get/load działają bez tego importu. Jest on jedna wymagany do odpalania zapytań w HQL. - konfiguracja ORM określona za pomocą annotacji JPA (AnnotationSessionFactoryBean):
- PAR deployment - nasze bundle zostają zapakowane w archiwum PAR
- konfiguracja ORM określona za pomocą annotacji JPA (AnnotationSessionFactoryBean):
- dao
Manifest-Version: 1.0
tym razem importujemy bundle Hibernate z dodatkowym atrybutem import-scope:=application, który jest pewnym rozszerzeniem Spring DM Server
Bundle-Version: 1.0.0
Bundle-Name: HibernateTest_dao Bundle
Bundle-ManifestVersion: 2
Bundle-SymbolicName: foo.bar.HibernateTest_dao
Import-Package: foo.bar.dao.api,
foo.bar.domain,
javax.sql;version="[0.0.0,0.0.0]"
Import-Bundle: com.springsource.org.apache.commons.dbcp,
com.springsource.org.hsqldb,
com.springsource.org.hibernate;version="[3.2.6.ga,3.2.6.ga]";import-scope:=application
Import-Library: org.springframework.spring.instrumented - domain
Manifest-Version: 1.0
Bundle-Version: 1.0.0
Bundle-Name: HibernateTest_domain Bundle
Bundle-ManifestVersion: 2
Bundle-SymbolicName: foo.bar.HibernateTest_domain
Export-Package: foo.bar.domain;version="1.0.0"
Import-Bundle: com.springsource.javax.persistence;version="[1.0.0,1.0.0]"
używamy jedynie annotacji JPA, nie musimy importować bundle Hibernate
- dao
- konfiguracja ORM określona w plikach konfiguracyjnych xml (LocalSessionFactoryBean):
- dao
Manifest-Version: 1.0
bez zmian
Bundle-Version: 1.0.0
Bundle-Name: HibernateTest_dao Bundle
Bundle-ManifestVersion: 2
Bundle-SymbolicName: foo.bar.HibernateTest_dao
Import-Package: foo.bar.dao.api,
foo.bar.domain,
javax.sql;version="[0.0.0,0.0.0]"
Import-Bundle: com.springsource.org.apache.commons.dbcp,
com.springsource.org.hsqldb,
com.springsource.org.hibernate;version="[3.2.6.ga,3.2.6.ga]";import-scope:=application
Import-Library: org.springframework.spring.instrumented - domain
skoro tym razem nie używamy JPA to nie potrzebujemy importu bundle JPA
Manifest-Version: 1.0
Bundle-Version: 1.0.0
Bundle-Name: HibernateTest_domain Bundle
Bundle-ManifestVersion: 2
Bundle-SymbolicName: foo.bar.HibernateTest_domain
Export-Package: foo.bar.domain;version="1.0.0"
- dao
Manifest-Version: 1.0
Web-DispatcherServletUrlPatterns: *.html
Module-Type: Web
Bundle-Version: 1.0.0
Bundle-Name: HibernateTest_web Bundle
Bundle-ManifestVersion: 2
Web-ContextPath: HibernateTest
Bundle-SymbolicName: foo.bar.HibernateTest_web
Import-Package: foo.bar.dao.api,
foo.bar.domain;version="[1.0.0,1.0.0]"
Import-Bundle: com.springsource.org.apache.taglibs.standard;version="[1.1.2,1.1.2]"
Import-Library: org.springframework.spring.instrumented
Dzięki importowaniu bundle Hibernate z atrybutem import-scope:=application nie ma potrzeby importowania Hibernate ani w bundle web ani w bundle domain. Po podłączeniu się za pomocą telnet do konsoli Equinox możemy wyświetlić nagłówki bundli wchodzące w skład naszego PAR, w ten sposób zobaczymy że, każdy z nich "automagicznie" importuje pakiety Hibernate. - konfiguracja ORM określona za pomocą annotacji JPA (AnnotationSessionFactoryBean):
Brak komentarzy:
Prześlij komentarz