Komponent encyjny: Cabin

Podobne dokumenty
Stanowe komponenty sesyjne

Enterprise JavaBeans

Enterprise JavaBeans. 1. Architektura EJB: komponenty encyjne, komponenty sesyjne, komponenty sterowane komunikatami. 2. Kontenery EJB JBoss.

Komponenty sterowane komunikatami

1. Model ACID. 2. Deklaratywne zarządzanie transakcjami, atrybuty transakcji. 3. Propagacja transakcji. transakcje rozproszone, propagacja kontekstu

Bazy danych tworzenie aplikacji bazodanowych ORM / JPA

Usługa TimerService

1. Podstawowe usługi bezpieczeństwa. 2. Użytkownicy i role. przydzielanie uprawnie ń metodom, role komponentów, korzystanie i konfiguracja

Bezstanowe komponenty sesyjne i zdarzenia zwrotne

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Aplikacje internetowe i rozproszone - laboratorium

Enterprise JavaBeans 3.0

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

public interface TravelAgent { public void makereservation(int cruiseid, int cabinid, int customerid, double price); }

Wywoływanie metod zdalnych

Wywoływanie metod zdalnych

akademia androida Składowanie danych część VI

Katalog książek cz. 2

Aplikacje RMI Lab4

Projektowanie Aplikacji Internetowych. Wzorce projektowe warstwy usług

EJB 3.0 & JBoss Seam. 25 kwietnia 2007 Jacek Gerbszt 1

Aplikacje RMI

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Instrukcja tworzenia aplikacji EE na bazie aplikacji prezentowanej na zajęciach lab.4 z PIO umożliwiająca przez sieć dostęp wielu użytkownikom.

Podejście obiektowe do budowy systemów rozproszonych

Metody dostępu do danych

Wzorce logiki dziedziny

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

Remote Method Invocation 17 listopada 2010

JAVA PERSISTENCE API. Wykorzystano fragmenty wykładów M. Piotrowskiego i M. Wójcika. Waldemar Korłub

Plan wykładu CORBA. Cechy aplikacji rozproszonych. Aplikacje rozproszone

Wprowadzenie db4o - podstawy db4o - technikalia Przydatne wiadomości. Wprowadzenie. db4o. Norbert Potocki. 1 czerwca Norbert Potocki db4o

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Zaawansowane aplikacje WWW - laboratorium

Nowy powiew od Słońca: EJB 3.0. Copyright Piotr Kochański & Erudis,

Programowanie komponentowe 5

Metody dostępu do danych

Remote Method Invocation 17 listopada rozproszonych. Dariusz Wawrzyniak (IIPP) 1

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Dostęp do baz danych z aplikacji J2EE

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

Tworzenie i wykorzystanie usług

1 Wprowadzenie do J2EE

Aplikacja webowa w Javie szybkie programowanie biznesowych aplikacji Spring Boot + Vaadin

Projektowanie oprogramowania. Warstwa integracji z bazą danych oparta na technologii ORM Platforma Java EE Autor: Zofia Kruczkiewicz

Enterprise JavaBeans (EJB)

Wzorce dystrybucji i wspólbieżności autonomicznej

Podstawowe informacje o technologii Java Persistence API - przykład

EJB 3.0 (Enterprise JavaBeans 3.0)

JAVA I BAZY DANYCH. MATERIAŁY:

Budowa aplikacji w technologii. Enterprise JavaBeans. Maciej Zakrzewicz PLOUG

JAVA PERSISTENCE API CZĘŚĆ 2 ASPEKTY ZAAWANSOWANE. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Podstawowe informacje o technologii Java Persistence API - przykład

Tworzenie aplikacji dla Oracle Application Server 10g R3 w technologii EJB 3.0

EJB 2.x oraz zmiany w standardzie dla EJB 3.0. Michał Stanek

Programowanie w języku Java. Bazy danych SQLite w Javie

Współbieżność w środowisku Java

Programowanie komponentowe

Programowanie Obiektowe Ćwiczenie 4

Systemy Rozproszone - Ćwiczenie 6

Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

Rola EJB na platformie Java EE. Enterprise JavaBeans (EJB)

E:\DYDAKTYKA\ZAI\ZWWW\Laboratoria\L07\Java Persistence.doc 2011-lis-24, 17:0 Zaawansowane aplikacje internetowe Laboratorium Java Persistence.

Zaawansowane aplikacje internetowe - laboratorium

Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

Plan prezentacji. Budowa aplikacji w technologii Enterprise JavaBeans. Przegląd architektur: CORBA. Cele budowy aplikacji rozproszonych

Oprogramowanie systemów równoległych i rozproszonych Wykład 7

2) W wyświetlonym oknie należy zaznaczyć chęć utworzenia nowej aplikacji (wygląd okna może się różnić od powyższego); kliknąć OK

Wprowadzenie do Enterprise JavaBeans 2.0

NHibernate Hibernate dla platformy.net. Hibernate posiada także dużą społeczność, zatem nietrudno uzyskać jakieś wsparcie w przypadku problemów.

Hibernate mapowanie baz danych

KLASY, INTERFEJSY, ITP

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Aplikacje RMI. Budowa aplikacji rozproszonych. Część 2.

Java Enterprise Edition spotkanie nr 6. przygotował Jacek Sroka. Java Persistence API

"Biznesowe" wzorce projektowe

Platforma J2EE i EJB. Oprogramowanie systemów równoległych i rozproszonych Wykład 9. Rola EJB na platformie J2EE. Dr inż. Tomasz Olas olas@icis.pcz.

Baza danych sql. 1. Wprowadzenie. 2. Repozytaria generyczne

1. Metryki złożoności modułowej i międzymodułowej Chidamber & Kemerer (CK)

Obsługa transakcji rozproszonych Java. Marek Wojciechowski, Maciej Zakrzewicz Instytut Informatyki, Politechnika Poznańska

SWING c.d. przydatne narzędzia: JFileChooser, JOptionPane. drag'n drop, menu kontekstowe.

Projektowanie Aplikacji Internetowych Jarosław Kuchta. Wzorce projektowe warstwy biznesowej

Tomasz Dobek.

Podstawowe wykorzystanie Hibernate

Programowanie obiektowe

Wieloplatformowe aplikacje sieciowe. dr inż. Juliusz Mikoda mgr inż. Anna Wawszczak

Fragmenty są wspierane od Androida 1.6

Wykład dla studentów Informatyki Stosowanej UJ 2012/2013

Budowa prostej aplikacji wielowarstwowej. Laboratorium 1 Programowanie komponentowe Zofia Kruczkiewicz

Programowanie rozproszone w języku Java

Java Persistence API (JPA)

Java wybrane technologie

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Dostęp do baz danych w aplikacjach Java EE

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Aplikacje biznesowe Wykład dla studentów Informatyki Stosowanej

Diagram stanów Laboratorium 9

Transkrypt:

Zarządzanie encjami 1. Komponenty i JBoss komponenty EJB, program kliencki. 2. Usługa EntityManager encje zarządzane i niezarządzane, kontekst transakcji, podstawowe usługi, transakcje poza JEE. 1

Komponenty i JBoss Struktura programu: 1. Serwer (titan.jar): komponent encyjny: Cabin deskryptor utrwalania: persistance.xml komponent sesyjny: TravelAgent 2. Klient: biblioteki, konfguracja JNDI, program korzystający z komponentów. 2

Komponent encyjny: Cabin package com.titan.domain; import javax.persistence.entity; import javax.persistence.table; import javax.persistence.column; import javax.persistence.id; @Entity @Table(name = "CABIN") public class Cabin implements java.io.serializable { private int id; private String name; private int decklevel; private int shipid; private int bedcount; 3

Komponent encyjny: Cabin @Id @Column(name = "ID") public int getid() { return id; public void setid(int pk) { id = pk; @Column(name = "NAME") public String getname() { return name; public void setname(string str) { name = str; @Column(name = "DECK_LEVEL") public int getdecklevel() { return decklevel; public void setdecklevel(int level) { decklevel = level; @Column(name = "SHIP_ID") public int getshipid() { return shipid; public void setshipid(int sid) { shipid = sid; @Column(name = "BED_COUNT") public int getbedcount() { return bedcount; public void setbedcount(int bed) { bedcount = bed; 4

Deskryptor utwalania Plik persistence.xml znajduje się w podkatalogu META-INF <?xml version="1.0" encoding="utf-8"?> <persistence> <persistence-unit name="titan"> <jta-data-source>java:/defaultds</jta-data-source> <properties> <property name="hibernate.hbm2ddl.auto" value="create-drop"/> </properties> </persistence-unit> </persistence> 5

Komponent sesyjny: TravelAgent package com.titan.travelagent; import javax.ejb.remote; import com.titan.domain.cabin; @Remote public interface TravelAgentRemote { public void createcabin(cabin cabin); public Cabin findcabin(int pkey); public void updatecabin(cabin cabin); 6

Komponent sesyjny: package com.titan.travelagent; TravelAgent import javax.ejb.stateless; import javax.persistence.entitymanager; import javax.persistence.persistencecontext; import com.titan.domain.cabin; @Stateless public class TravelAgentBean implements TravelAgentRemote { @PersistenceContext(unitName = "titan") private EntityManager manager; public void createcabin(cabin cabin) { manager.persist(cabin); public Cabin findcabin(int pkey) { return manager.find(cabin.class, pkey); public void updatecabin(cabin cabin) { manager.merge(cabin); 7

Biblioteki dla klienta Do prawidłowego działania niezbędne są biblioteki (narzędzia) pozwalające korzystać z usług kontenera, a w przypadku oprogramowania klienckiego ze zdalnych komponentów. Biblioteki są udostępniane przez producenta kontenera EJB. W przypadku serwera JBoss należy użyć z następujących plików: ejb3-persistence.jar jboss-aop-jdk50-client.jar jboss-aspect-jdk50-client.jar jboss-ejb3-client.jar jboss-ejb3x.jar jbossall-client.jar które można znaleźć w podkatalogu client/ serwera. 8

Konfguracja JNDI u klienta Konfguracja JNDI zapisana jest w pliku jndi.properties. Aby zachować takie ustawienia dla wszystkich programów korzystających z JNDI plik należy umieścić na ścieżce klas. java.naming.factory.initial=org.jnp.interfaces.namingcontextfactory java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces java.naming.provider.url=127.0.0.1 9

Program klienta package com.titan.clients; import java.io.ioexception; import java.util.properties; import javax.naming.context; import javax.naming.initialcontext; import javax.naming.namingexception; import com.titan.domain.cabin; import com.titan.travelagent.travelagentremote; public class Client { static{ Properties p = new Properties(); try { p.load(client.class.getresourceasstream( "jndi.properties")); catch (IOException e) { e.printstacktrace(); System.getProperties().putAll(p); 10

Program kliencki public static Context getinitialcontext() throws NamingException { return new InitialContext(); public static void main(string[] args) { try { Context jndicontext = getinitialcontext(); Object ref = jndicontext.lookup("travelagentbean/remote"); TravelAgentRemote dao = (TravelAgentRemote) ref; Cabin c = dao.findcabin(1); if (c==null){ System.out.println("new cabin"); c = new Cabin(); 11

Program kliencki c.setid(1); c.setname("master Suite"); c.setdecklevel(1); c.setshipid(1); c.setbedcount(3); dao.createcabin(c); else{ System.out.println("present cabin"); System.out.println(c.getName()); System.out.println(c.getDeckLevel()); System.out.println(c.getShipId()); System.out.println(c.getBedCount()); catch (javax.naming.namingexception ne) { ne.printstacktrace(); 12

build.xml <?xml version="1.0"?> <project name="wzorce-03" default="ejbjar" basedir="."> <property environment="env"/> <property name="src.dir" value="${basedir/src"/> <property name="lib.dir" value="${basedir/lib"/> <property name="classes.dir" value="${basedir/bin"/> <property name="build.dir" value="${basedir/build"/> <target name="ejbjar"> <jar jarfile="${build.dir/titan.jar"> <fileset dir="${classes.dir"> <include name="com/titan/domain/*.class"/> <include name="com/titan/travelagent/*.class"/> </fileset> <fileset dir="${src.dir/"> <include name="meta-inf/persistence.xml"/> </fileset> </jar> </target> 13

build.xml <target name="run.client"> <java classname="com.titan.clients.client" fork="yes" dir="."> <classpath> <fileset dir="${classes.dir"> <include name="${lib.dir/*.jar"/> </fileset> </classpath> </java> </target> </project> 14

Usługa EntityManager Menadżer encji udostępnia metody pozwalające wykonywać podstawowe operacje na tych obiektach. Do operacji tych należą: utrwalanie, wyszukiwanie, scalanie, usuwanie, synchronizacja, blokowanie dostępu. źródło: http://docs.oracle.com/javaee/6/api/javax/persistence/entitymanager.html 15

Utrwalanie Utrwalenie POJO dokonuje się za pomocą metody void persist(object). W jej wyniku menadżer umieszcza w kolejce odpowiednie żądanie zapisu obiektu w bazie danych. Moment rzeczywistego zapisu zależy od kontenera i innych okoliczności (transakcje). Ponadto metoda ta dołącza POJO do zbioru zarządzanych encji. Typowe wyjątki: IllegalArgumentException argument nie jest encją, EntityExistsException encja już istnieje, TransactionRequiredException wywołanie poza kontekstem transakcji. 16

Encje zarządzane i niezarządzane Po utworzeniu obiektu Cabin za pomocą konstruktora jest on zwykłym POJO. Zmiany atrybutów nie mają żadnego wpływu na zawartość bazy danych. Encja jest niezarządzana (odłączona). Dopiero wywołanie metody EntityManager.persist() powoduje związanie stanu obiektu z bazą danych. Od tej chwili encja jest zarządzana (dołączona do zbioru zarządzanych encji) w ramach określonego kontekstu transakcyjnego. Cabin c = new Cabin();... // encja niezarządzana manager.persist(c); // utrwalenie i początek zarządzania... // encja zarządzana return c; // zwykle koniec zarządzania 17

Odnajdywanie klucz główny Do uzyskania referencji do encji na podstawie klucza głównego służą metody: <T> T find(class<t>, Object) zwraca referencję do encji lub null, <T> T getreference(class<t>, Object) zwraca referencję do encji, której stan może być załadowany dopiero w momencie odwołania się do niego (lazy fetched). W przypadku nieodnalezienia encji zwracany jest wyjątek EntityNotFoundException. Ze względu na sposób działania metody, wyjątek może zostać zwrócony dopiero w momencie odwołania się do stanu encji. 18

Odnajdywanie język QL Do uzyskania referencji można skorzystać także z zapytań wyrażonych w języku QL (Query Language). Query query = manager.createquery("from Cabin c where id=2"); Cabin c = (Cabin)query.getSingleResult( ); Wszystkie encje zwracane przez find(), getreference(), czy też zapytania QL są zarządzane dopóki kontekst zarządzania, w którym zostały odczytane jest aktywny. 19

Kontekst transakcji i zarządzanie Adnotacja @TransactionAttribute(TransactionAttributeType.REQUIRED) powoduje, że metoda somemethod() zostanie wykonana jako transakcja. @PersistenceContext(unitName = "titan") EntityManager entitymanager; @TransactionAttribute(TransactionAttributeType.REQUIRED) // kontekst transakcji public Cabin somemethod() { Cabin c = entitymanager.find(cabin.class, 1); // uzyskanie referencji do encji // zarządzanej c.setname("new name"); return c; // zmiana automatycznie zapisana // w bazie danych // koniec transakcji encja // niezarządzana wszelkie zmiany na zwróconej referencji nie będą odwzorowane w bazie danych, aż do kolejnego wywołania odpowiedniej metody 20

Scalanie encji Encje odłączone można ponownie związać z utrwalonym stanem w bazie danych korzystając z metody <T> T merge(t). @TransactionAttribute(TransactionAttributeType.REQUIRED) public Cabin update(cabin c) { // c encja (odłączona lub dołączona) Cabin copy = manager.merge(c); // copy - encja zarządzana (przyłączona) z atrybutami // skopiowanymi z c // c - encja odłączona copy.setname("name1"); // nazwa zmieniona w obiekcie i bazie c.setname("name2"); // nazwa zmieniona tylko w obiekcie 21

Usuwanie encji Usuwanie pojedynczej encji można zrealizować za pomocą operacji void remove(object). Powoduje ono dodanie do kolejki odpowiedniej operacji DELETE wykonywanej na bazie danych. @TransactionAttribute(TransactionAttributeType.REQUIRED) public Cabin removecabin(int key) { Cabin cabin = manager.find(cabin.class, key); manager.remove(cabin); return cabin; Operację remove() można odwrócić wywołując metodę persist() z tą samą encją w roli argumentu. 22

Odświeżanie encji Jeżeli chcemy odświeżyć stan zarządzanej encji na podstawie informacji w bazie danych używamy metody void refresh(object). @TransactionAttribute(TransactionAttributeType.REQUIRED) public void somemethod(int id) { Cabin cabin = manager.find(cabin.class, id); manager.refresh(cabin); W przypadku braku encji w bazie lub wśród obiektów zarządzanych zwracany jest IllegalArgumentException. 23

Inne operacje Interfejs EntityManager określa także inne metody. Najczęściej używane to: boolean contains(object) sprawdza, czy encja jest zarządzana, void clear() - odłącza wszystkie zarządzane encje, void flush() - synchronizuje bazę danych ze stanem encji. Synchronizacja odbywa się w zależności od parametru ustawionego metodą: setflushmode(flushmodetype). Domyślny typ to AUTO odpowiadający synchronizacji na poziomie zapytań. Typ COMMIT określa synchronizację na poziomie transakcji. EntityTransaction gettransaction() - zwraca obiekt do zarządzania transakcjami na poziomie zasobów. 24

Transakcje Transakcje w ramach contenera JEE są zarządzane poprzez JTA (Java Transaction Api). W środowisku niezgodnym z JEE (np. w programach klienckich) transakcjami można zarządzać poprzez interfejs EntityTransaction. public interface EntityTransaction { public void begin( ); public void commit( ); public void rollback( ); public boolean isactive( ); 25

Transakcje... // uzyskanie interfejsu EntityManagerFactory EntityManagerFactory factory = Persistence.createEntityManagerFactory("titan"); // uzyskanie kontekstu utrwalania EntityManager manager = factory.createentitymanager();... // uzyskanie interfejsu do zarządzania transakcjami EntityTransaction transaction = (EntityTransaction) manager.gettransaction(); transaction.begin(); // początek transakcji... manager.persist(cabin_1);... transaction.commit(); // koniec transakcji 26

Podsumowanie Usługa EntityManager umożliwia zarządzanie komponentami encyjnymi realizując podstawowe operacje, takie jak: utrwalanie, synchronizacja, usuwanie. Ponadto EntityManager udostępnia interfejs transakcyjny. Usługa EntityManager jest dostępna zarówno dla komponentów działających w ramach kontenera EJB jak również dla programów klienckich. 27