enterprise javabeans 3 - jaceklaskowski.pl · enterprise javabeans 3.0 enterprise javabeans (ejb)...
TRANSCRIPT
Enterprise JavaBeans 3.0
Jacek Laskowskihttp://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 biznesowego2.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;
@Statelesspublic 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 Prelegentpackage pl.jaceklaskowski.ejb3.testy.encje;
import java.io.Serializable;
import javax.persistence.Entity;import javax.persistence.Id;
@Entitypublic 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?