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?

Podobne dokumenty