Enterprise JavaBeans 3.0
Transkrypt
Enterprise JavaBeans 3.0
Enterprise JavaBeans 3.0 Jacek Laskowski http://www.JacekLaskowski.pl Politechnika Poznańska – Poznań, 07.12.2007, wersja 1 O mnie... ● Entuzjasta technologii Java EE 5 ● Założyciel i lider Warszawa JUG ● ● ● ● ● Członek zespołów rozwojowych Apache Geronimo, Apache OpenEJB, Apache ServiceMix, Apache ActiveMQ, Apache XBean Uczestnik programów NetBeans Community Acceptance Test (NetCAT) 5.0, 5.5 i 6.0 Prowadzi Notatnik Projektanta Java EE http://www.JacekLaskowski.pl Założyciel Polskiej Grupy Użytkowników Technologii BEA (PLBUG) Służbowo: konsultant oprogramowania w IBM Certyfikacja SCBCD 5 Literatura Specyfikacje Enterprise JavaBeans 3.0 ● Enterprise JavaBeans (EJB) – rozproszony model komponentów aplikacyjnych ● Część Java EE 5 ● Specyfikacja EJB3 zatwierdzona 2 maja 2006r. ● Implementacje: – GlassFish – referencyjna implementacja Java EE 5 – Apache Geronimo 2 z Apache OpenEJB 3 – IBM WebSphere Application Server 6.1 z EJB 3.0 Feature Pack – BEA WebLogic Server 10 – JBoss AS 4.2.2 z dodatkiem EJB 3.0 Fundamenty EJB3 ● ● ● ● POJO (ang. Plain-Old Java Object) – powrót do korzeni – JavaBeans Konfiguracja przez nadpisywanie (ang. configuration by exception) Java SE 5 a przede wszystkim adnotacje Wstrzeliwanie zależności (ang. DI – dependency injection) ● Interceptory (ang. interceptors) ● Plik jar jako format dystrybucji Projekty otwarte a EJB3 ● Kształt EJB3 pod wpływem projektów otwartych (ang. OSS – open source software) – Spring Framework – Hibernate – XDoclet – AspectWerkz/AspectJ – ...wiele innych Rezultat prac nad EJB3 ● ● ● ● ● Intuicyjne tworzenie komponentów biznesowych Bezinwazyjność – realizujemy założenia biznesowe a nie specyfikacji Dowolne Java IDE – Brak wymagań odnośnie środowiska programistycznego Możliwość uruchomienia komponentów encyjnych w ramach Java SE Uproszczone testowanie poza środowiskiem serwera aplikacyjnego Typy komponentów EJB3 ● ● ● ● Bezstanowe ziarno sesyjne (ang. SLSB – stateless session bean) Stanowe ziarno sesyjne (ang. SFSB – stateful session bean) Ziarno sterowane komunikatami (ang. MDB – message-driven bean) Komponent encyjny – encja (ang. entity bean) Przeznaczenie biznesowe komponentów ● ● ● Ziarno sesyjne – nietrwały, ulotny, modeluje akcje (na encjach) – SLSB – agent bezstanowy (czasownik) – SFSB – podobnie jak SLSB tyle, że dla wybranego klienta – utrzymuje jego stan (rzeczownik) Ziarno sterowane komunikatami – asynchroniczna komunikacja Encja – trwały (najczęściej baza danych) – Encja – byt (rzeczownik) Konfiguracja przez nadpisywanie ● ● ● ang. Configuration by exception (CbE) Brak konfiguracji = w użyciu domyślne parametry konfiguracyjne Porządek ważności parametrów konfiguracyjnych – Domyślne wartości (np. @Local, REQUIRED, @PermitAll) – Annotacje (np. @Stateless) – Deskryptor instalacji (META-INF/ejb-jar.xml) Korzyści CbE ● Szybkie tworzenie komponentów ● Uproszczone prototypowanie ● ● Możliwość nadpisywania wartości konfiguracyjnych na życzenie, np. per środowisko Stosowanie annotacji jako dokumentacja kodu i możliwe nadpisanie w deskryptorze instalacji Typy interfejsów ● ● ● Interfejs biznesowy – Lokalny (@Local) – Zdalny (@Remote) Interfejs usługi internetowej (ang. web services) - @WebService per klasa lub @WebMethod per metoda (wyłącznie SLSB) Interfejs biznesowy MDB to interfejs usługi komunikatów, np. javax.jms.MessageListener dla JMS Interceptory ● Interceptor to metoda przechwytująca zdarzenia związane ze stadiami rozwojowymi ziarna bądź wywołaniem jego metod biznesowych ● Wyłącznie dla komponentów sesyjnych i MDB ● Annotacje @Interceptors na klasie komponentu ● Domyślne interceptory w deskryptorze ● InvocationContext – interfejs „komunikacyjny” dla wielu interceptorów związanych z pojedyńczym komponentem Interceptory rozwojowe ● ● ● Interceptory zwrotne związane ze stadiami rozwojowymi ziarna (ang. lifecycle callback interceptor methods) Annotacje – @PostConstruct – @PreDestroy – @PostActivate – @PrePassivate Sygnatura: void metoda() i void metoda(InvocationContext) Interceptory biznesowe ● Interceptory biznesowe (ang. business method interceptors) uruchamiane przed wywołaniem metod biznesowych ● @AroundInvoke bądź around-invoke w DD ● Sygnatura metody: public Object metoda(InvocationContext) throws Exception Sytuacje wyjątkowe ● ● ● ● ● Wyróżniamy wyjątki aplikacyjne i systemowe Wyjątki aplikacyjne – związane z działaniem biznesowym komponentu, w ramach aplikacji (deklaracja poprzez throws) @ApplicationException – dowolna klasa wyjątku kontrolowanego lub nie, która przekazywana jest klientowi bezpośrednio application-exception w deskryptorze instalacji (ejb-jar.xml) Obsługa transakcji poprzez element rollback Sytuacje wyjątkowe - cd. ● ● ● ● ● Wyjątki systemowe – związane z działaniem komponentu jako części serwera RemoteException i RuntimeException i ich podklasy (za wyjątkiem @ApplicationException) Przykłady: – Brak połączenia z bazą danych – Wyjątki związane z działaniem JNDI – Błędy wirtualnej maszyny Java (JVM) Opakowane jako javax.ejb.EJBException W efekcie wycofanie transakcji i usunięcie komponentu z systemu Tworzenie ziarna EJB3 ● 2-krokowy proces: 1.Definiowanie interfejsu biznesowego 2.Klasa ziarna jako implementacja interfejsu biznesowego Komponent EJB3 - przykład ● Interfejs biznesowy - ExamScheduler package pl.jaceklaskowski.exam.scheduler; import java.util.List; import pl.jaceklaskowski.exam.beans.Exam; public interface ExamScheduler { List<Exam> getExams(); } Komponent EJB3 - przykład ● Klasa komponentu package pl.jaceklaskowski.exam.scheduler; import java.util.List; import pl.jaceklaskowski.exam.beans.Exam; public class ExamSchedulerBean implements ExamScheduler { public List<Exam> getExams() { return ...; } } ● Nie, to nie wszystko... ;-) Komponent EJB3 - przykład ● Obowiązkowo określamy typ komponentu package pl.jaceklaskowski.exam.scheduler; import java.util.List; import javax.ejb.Stateless; import pl.jaceklaskowski.exam.beans.Exam; @Stateless public class ExamSchedulerBean implements ExamScheduler { public List<Exam> getExams() { return ...; } } Pytania? Nie! To jeszcze nie koniec... Laboratoria - agenda ● ● Utworzenie aplikacji przemysłowej z EJB3 – Ziarno sterowane komunikatami (MDB) z klientem zdalnym – Ziarno MDB – Usługa sieciowa JAX-WS jako bezstanowe ziarno sesyjne (SLSB) Wykorzystane oprogramowanie: – Eclipse 3.3.1 z wtyczką dla Geronimo – NetBeans IDE 6.0 Pytania? Nie! To jeszcze nie koniec... Java Persistence API 1.0 ● ● ● ● Java Persistence API – interfejs programistyczny do obiektowej obsługi danych składowanych w relacyjnych bazach danych Część Java EE 5 w ramach EJB3 Specyfikacja JPA 1.0 zatwierdzona 2 maja 2006r. Implementacje: – Apache OpenJPA – TopLink Essentials (TopLink JPA) – Hibernate EntityManager (Hibernate JPA) Fundamenty JPA ● ● ● ● ● POJO (ang. Plain-Old Java Object) – powrót do korzeni – JavaBeans Konfiguracja przez nadpisywanie (ang. configuration by exception) – konfiguracja jest wyjątkiem od ogólnie przyjętej reguły Java SE 5 a przede wszystkim adnotacje Wstrzeliwanie zależności (ang. DI – dependency injection) – alternatywa dla JNDI Plik jar jako format dystrybucji Rezultat prac nad JPA ● ● ● ● ● Intuicyjne tworzenie komponentów biznesowych Bezinwazyjność - realizujemy założenia biznesowe a nie specyfikacji Brak wymagań odnośnie środowiska programistycznego – dowolne Java IDE Możliwość uruchomienia komponentów encyjnych w ramach Java SE Uproszczone testowanie poza środowiskiem serwera aplikacyjnego Nomenklatura JPA ● Encja – obiekt trwały (egzemplarz klasy encji) ● Klasa encji – klasa reprezentująca stan encji ● ● ● Zarządca encji – interfejs do zarządzania kontekstem trwałym Fabryka zarządców encji – interfejs do tworzenia (aplikacyjnych) zarządców trwałych Kontekst trwały – zbiór zarządzanych obiektów trwałych, w którym dla danego identyfikatora trwałego istnieje pojedyńczy egzemplarz encji Liczność bytów JPA Za Pro EJB 3 – Java Persistence API – Apress strona 24 EntityManagerFactory API ● EntityManager createEntityManager() ● EntityManager createEntityManager(Map map) ● void close() ● boolean isOpen() Stadia rozwojowe encji ● ● Encja nowa (ang. new) – Utworzenie egzemplarza klasy encji – Brak identyfikatora trwałego – Encja nie związana z żadnym kontekstem trwałym Encja zarządzana (ang. managed) – Przypisany trwały identyfikator – Encja związana z kontekstem trwałym – Zmiany automatycznie zapisywane w bazie danych Stadia rozwojowe encji kont. ● ● Encja odłączona (ang. detached) – Encja posiadająca identyfikator trwały – Nie związana z kontekstem trwałym – Zmiany nie mają odzwierciedlenia w bazie danych – „Zwykły” egzemplarz klasy encji Encja usunięta (ang. Removed) – ● Encja zarządzana oczekująca trwałego usunięcia Nie istnieje API do rozpoznania stadium rozwojowego encji, ale... EntityManager API ● ● ● void clear() – Czyści kontekst trwały – Wszystkie zarządzane encje przechodzą w stan odłączony <T> T merge(T entity) – Synchronizuje stan encji z kontekstem trwałym – Przejście ze stanu odłączonego w stan zarządzany – UWAGA: Jedynie zwrócona encja jest zarządzana void persist(Object entity) – Utrwalenie egzemplarza encji – Encja w stanie zarządzanym EntityManager API kont. ● ● void refresh(Object entity) – Odświeża stan encji danymi z bazy danych – Nadpisuje zmiany stanu encji void remove(Object entity) – Usuwa encję Pytania? Nie! To jeszcze nie koniec... Środowisko rozpoznawania JPA ● ● ● Korzysta z Apache Maven 2.0.8 Tworzenie artefaktów projektowych w wybranym IDE (obecnie Eclipse IDE 3.3) Możliwość wyboru dostawcy JPA oraz bazy danych – ● domyślnie Apache OpenJPA z Apache Derby Uruchomienie testów z poziomu IDE lub linii poleceń Przykład #1 – cykl rozwojowy encji ● ● Przykład demonstruje użycie interfejsu EntityManager Klasa LifecycleTest – mvn -Dtest=LifecycleTest clean test Konfiguracja JPA ● ● ● META-INF/persistence.xml – plik konfiguracyjny JPA (deskryptor XML dla JPA) Opisuje konfigurację zarządcy encji – Obowiązkowy atrybut: nazwa jednostki trwałej – Dostawca JPA – Obsługa transakcji – Klasy encji – Właściwości konfiguracyjne dostawcy JPA Może istnieć wiele definicji jednostek trwałych (Aplikacyjna) konfiguracja JPA <?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ ns/persistence/persistence_1_0.xsd"> <persistence-unit name="testPU" transaction-type="RESOURCE_LOCAL"> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> <class>pl.jaceklaskowski.jpa.entity.Osoba</class> <class>pl.jaceklaskowski.jpa.entity.Projekt</class> <class>pl.jaceklaskowski.jpa.entity.PracownikSpecjalny</class> <class>pl.jaceklaskowski.jpa.entity.A</class> <exclude-unlisted-classes>true</exclude-unlisted-classes> <properties> <property name="openjpa.ConnectionDriverName" value="org.apache.derby.jdbc.EmbeddedDriver" /> <property name="openjpa.ConnectionURL" value="jdbc:derby:target/derbyDB;create=true" /> <property name="openjpa.ConnectionUserName" value="app" /> <property name="openjpa.ConnectionPassword" value="app" /> <property name="openjpa.jdbc.DBDictionary" value="derby" /> <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(SchemaAction='add,deleteTableContents')" /> <property name="openjpa.Log" value="DefaultLevel=TRACE,SQL=TRACE" /> <!-- Breaks maven-surefire-plugin with TestNG --> <property name="openjpa.QueryCompilationCache" value="false" /> </properties> </persistence-unit> </persistence> (Serwerowa) konfiguracja JPA <?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ ns/persistence/persistence_1_0.xsd"> <persistence-unit name="TestyEJB3EncjePU"> <jta-data-source>jdbc/TestyEjb3Postgres</jta-data-source> <properties> <property name="toplink.ddl-generation" value="drop-and-create-tables" /> <property name="toplink.logging.level" value="INFO" /> </properties> </persistence-unit> </persistence> Przykład #2 – JPA w Java SE ● ● Przykład demonstruje konstrukcję samodzielnej aplikacji korzystającej z JPA (w trybie poza kontenerem) Na podstawie artykułów w moim Wiki – OpenJPA jako dostawca JPA w samodzielnej aplikacji – Java Persistence API w samodzielnej aplikacji – Hibernate jako dostawca JPA w samodzielnej aplikacji Przykład #3 – JPA w Java EE ● ● Przykład demonstruje prostotę tworzenia aplikacji korporacyjnej korzystającej z usług serwera aplikacyjnego Java EE 5 Zlecenie obsługi elementów składowych kontenerowi (serwerowi) ● Ziarno bezstanowe EJB z JPA ● Na podstawie artykułu w moim Wiki – Aplikacja korporacyjna z JPA w trybie JTA z GlassFish i PostgreSQL Pytania? Nie! To jeszcze nie koniec... Tworzenie encji ● ● Zbudowanie klasy reprezentującej byt w domenie biznesowej (POJO) Uaktywnienie klasy jako klasy encji za pomocą adnotacji – Adnotacje na polach – Adnotacje na metodach odczytujących (ang. setter) ● Definicja jednostki trwałej (persistence.xml) ● Opcjonalna definicja mapowania – Adnotacje – Plik META-INF/orm.xml Podstawowe adnotacje JPA ● ● @Entity – oznaczenie klasy jako klasy encji @Id – oznaczenie pola jako typu identyfikatora trwałego Encja Prelegent package pl.jaceklaskowski.ejb3.testy.encje; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class Prelegent implements Serializable { private static final long serialVersionUID = 1L; @Id private long id; private String imie; private String nazwisko; public Prelegent() { } public Prelegent(String imie, String nazwisko) { this.imie = imie; this.nazwisko = nazwisko; } public long getId() { return id; } // Zauważ zmianę widoczności metody, aby wybrani mogli z niej skorzystać void setId(long id) { this.id = id; } // metody modyfikujace i odczytujące } Mapujące adnotacje JPA ● @Table – tabela podstawowa dla encji ● @Column – definicja charakterystyki kolumny ● @GeneratedValue ● ● – generator – AUTO, IDENTITY, SEQUENCE, TABLE – strategy – domyślnie AUTO @OneToOne, @OneToMany, @ManyToMany, @ManyToOne @Basic z atrybutem fetch (domyślnie EAGER) Konfiguracja mapowania JPA ● ● ● Plik META-INF/orm.xml Ważniejszy niż konfiguracja mapowania za pomocą adnotacji Każdej adnotacji odpowiada element deskryptora mapowania Przykładowy orm.xml <entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" version="1.0"> <entity class="pl.jaceklaskowski.jpa.entity.A"> <attributes> <basic name="str2"> <column name="col2" length="4" /> </basic> </attributes> </entity> </entity-mappings> Typy zarządców encji ● ● Podział ze względu na zarządzanie nimi – Aplikacyjny zarządca encji – Serwerowy zarządca encji Podział ze względu na transakcje – Zarządca encji JTA – Zarządca encji lokalny dla zasobu Pytania? Nie! To jeszcze nie koniec... Java Persistence QL ● Java Persistence Query Language (JPQL) – język zapytań JPA łudząco podobny do SQL ● Obowiązkowe klauzule SELECT ... FROM ... ● EntityManager.createN...Query() – N... = Named lub Native – Zapytania nazwane – Zapytania natywne ● @NamedQuery lub named-query ● @NamedNativeQuery lub named-native-query Query API ● int executeUpdate() ● List getResultList() ● Object getSingleResult() ● Query setParameter() – Parametry w zapytaniu poprzedzone dwukropkiem – Parametry metody setParameter już bez niego Pytania? Nie! To jeszcze nie koniec, ale już blisko... Lektura do poduszki ● Specyfikacja JPA http://jcp.org/aboutJava/communityprocess/ final/jsr220/index.html ● Strona Java Persistence API http://java.sun.com/javaee/ technologies/persistence.jsp ● Relacje z lektury specyfikacji JPA w Notatniku http://jlaskowski.blogspot.com/search/label/jpa ● Artykuły o JPA na moim Wiki – Aplikacja korporacyjna z JPA w trybie JTA z GlassFish i PostgreSQL – Java Persistence API w samodzielnej aplikacji – OpenJPA jako dostawca JPA w samodzielnej aplikacji – Hibernate jako dostawca JPA w samodzielnej aplikacji Laboratoria - agenda ● ● Utworzenie aplikacji przemysłowej z EJB3 – Ziarno sterowane komunikatami (MDB) z klientem zdalnym – Ziarno MDB z JPA w trybie JTA – Usługa sieciowa JAX-WS jako bezstanowe ziarno sesyjne (SLSB) z JPA Wykorzystane oprogramowanie: – Eclipse 3.3.1 z wtyczką dla Geronimo – NetBeans IDE 6.0 I to na dziś tyle...Pytania? Słucham?