ZAWWW-2st1.2-l07.tresc-1.0: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Nie podano opisu zmian
 
Nie podano opisu zmian
 
Linia 12: Linia 12:
a) Uruchom narzędzie NetBeans IDE 5.5
a) Uruchom narzędzie NetBeans IDE 5.5


b) Z menu głównego wybierz File->New Project. Wybierz kategorię General i typ projektu Java Application. Kliknij przycisk Next >.
b) Z menu głównego wybierz File->New Project. Wybierz kategorię General i typ projektu Java Application. Kliknij przycisk Next >.


[[Image:ZAWWW-2st1_2-l07_tresc-1_0_01.png|605px]]
[[Image:ZAWWW-2st1_2-l07_tresc-1_0_01.png|605px]]
Linia 35: Linia 35:
2. Utworzenie jednostki trwałości, w ramach której obiekty aplikacji będą zachowywane w bazie danych
2. Utworzenie jednostki trwałości, w ramach której obiekty aplikacji będą zachowywane w bazie danych


a) Kliknij prawym przyciskiem myszy na ikonie projektu w drzewie projektów i z menu kontekstowego wybierz New->File/Folder. Kliknij przycisk Next >.
a) Kliknij prawym przyciskiem myszy na ikonie projektu w drzewie projektów i z menu kontekstowego wybierz New->File/Folder. Kliknij przycisk Next >.


[[Image:ZAWWW-2st1_2-l07_tresc-1_0_04.png]]
[[Image:ZAWWW-2st1_2-l07_tresc-1_0_04.png]]
Linia 47: Linia 47:
[[Image:ZAWWW-2st1_2-l07_tresc-1_0_06.png]]
[[Image:ZAWWW-2st1_2-l07_tresc-1_0_06.png]]


d) Obejrzyj zawartość wygenerowanego przez kreator pliku persistence.xml w trybie XML. Zwróć uwagę na elementy <provider> i <property> zawierające wartości odpowiadające opcjom wybranym w oknie kreatora. Sprawdź czy zarówno właściwość toplink.jdbc.user i toplink.jdbc.password mają wartość „app" i jeśli nie to popraw zawartość pliku.
d) Obejrzyj zawartość wygenerowanego przez kreator pliku persistence.xml w trybie XML. Zwróć uwagę na elementy &lt;provider&gt; i &lt;property&gt; zawierające wartości odpowiadające opcjom wybranym w oknie kreatora. Sprawdź czy zarówno właściwość toplink.jdbc.user i toplink.jdbc.password mają wartość „app" i jeśli nie to popraw zawartość pliku.


<tt>
<tt>
Linia 62: Linia 62:
3. Utworzenie klasy encji Bug. Z każdym albumem będzie związany jeden wykonawca. Każdy wykonawca będzie posiadał kolekcję albumów.
3. Utworzenie klasy encji Bug. Z każdym albumem będzie związany jeden wykonawca. Każdy wykonawca będzie posiadał kolekcję albumów.


a) Kliknij prawym przyciskiem myszy na ikonie projektu w drzewie projektów i z menu kontekstowego wybierz New->File/Folder. Kliknij przycisk Next >.
a) Kliknij prawym przyciskiem myszy na ikonie projektu w drzewie projektów i z menu kontekstowego wybierz New-&gt;File/Folder. Kliknij przycisk Next &gt;.


b) Następnie wybierz kategorię Persistence i typ pliku Entity Class. Kliknij przycisk Next >.
b) Następnie wybierz kategorię Persistence i typ pliku Entity Class. Kliknij przycisk Next &gt;.


c) Jako nazwę klasy podaj Bug, a jako nazwę pakietu encje. Pozostaw Long jako typ klucza głównego (Primary Key Type). Kliknij przycisk Finish.
c) Jako nazwę klasy podaj Bug, a jako nazwę pakietu encje. Pozostaw Long jako typ klucza głównego (Primary Key Type). Kliknij przycisk Finish.
Linia 70: Linia 70:
[[Image:ZAWWW-2st1_2-l07_tresc-1_0_08.png]]
[[Image:ZAWWW-2st1_2-l07_tresc-1_0_08.png]]


d) Ponownie obejrzyj zawartość pliku persistence.xml w trybie XML. Zwróć uwagę na element <class> dodany przez kreator tworzenia klasy encji. Atrybut ten oznacza, że utworzona klasa encji została wskazana jako zarządzana klasa trwała dla jednostki trwałości BugsJPPU.
d) Ponownie obejrzyj zawartość pliku persistence.xml w trybie XML. Zwróć uwagę na element &lt;class&gt; dodany przez kreator tworzenia klasy encji. Atrybut ten oznacza, że utworzona klasa encji została wskazana jako zarządzana klasa trwała dla jednostki trwałości BugsJPPU.


e) Przejdź do edycji utworzonego pliku Bug.java. Pod adnotacją @Entity dodaj wiersz z adnotacją @Table(name="BUGS"), aby obiekty klasy były składowane w tabeli o nazwie BUGS (domyślnie nazwa tabeli byłaby taka jak nazwa klasy – w liczbie pojedynczej). Jeśli wprowadzona adnotacja zostanie podkreślona jako błąd, będąc kursorem w wierszu z adnotacją naciśnij kombinację klawiszy Alt-Enter i wybierz zaproponowaną opcję Add import for javax.persistence.Table.
e) Przejdź do edycji utworzonego pliku Bug.java. Pod adnotacją @Entity dodaj wiersz z adnotacją @Table(name="BUGS"), aby obiekty klasy były składowane w tabeli o nazwie BUGS (domyślnie nazwa tabeli byłaby taka jak nazwa klasy – w liczbie pojedynczej). Jeśli wprowadzona adnotacja zostanie podkreślona jako błąd, będąc kursorem w wierszu z adnotacją naciśnij kombinację klawiszy Alt-Enter i wybierz zaproponowaną opcję Add import for javax.persistence.Table.
Linia 79: Linia 79:


{|border="2" cellspacing="0" cellpadding="4" width="100%"
{|border="2" cellspacing="0" cellpadding="4" width="100%"
|align = "justify"|@Entity<br>@Table(name="BUGS")<br>public&nbsp;class&nbsp;Bug&nbsp;implements&nbsp;Serializable&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;@Id<br>&nbsp;&nbsp;&nbsp;&nbsp;@GeneratedValue(strategy&nbsp;=&nbsp;GenerationType.AUTO)<br>&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Long&nbsp;id;<br>&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;num;<br>&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;description;<br>'''...'''
|align = "justify"|@Entity<br>@Table(name="BUGS")<br>public&nbsp;class&nbsp;Bug&nbsp;implements&nbsp;Serializable&nbsp;<nowiki>{</nowiki><br>&nbsp;&nbsp;&nbsp;&nbsp;@Id<br>&nbsp;&nbsp;&nbsp;&nbsp;@GeneratedValue(strategy&nbsp;=&nbsp;GenerationType.AUTO)<br>&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Long&nbsp;id;<br>&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;num;<br>&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;description;<br>'''...'''
|-
|-
|}
|}
Linia 85: Linia 85:
</tt>
</tt>


g) W oknie edycji klasy Bug prawym klawiszem myszy wywołaj menu kontekstowe i wybierz opcję Refactor->Encapsulate fields w celu utworzenia w klasie metod set/get dla pól. Upewnij się, że pola wyboru dla wszystkich metod set/get są zaznaczone. Odznacz pole Preview all changes, aby zmiany nie wymagały potwierdzenia i kliknij przycisk Next >.
g) W oknie edycji klasy Bug prawym klawiszem myszy wywołaj menu kontekstowe i wybierz opcję Refactor-&gt;Encapsulate fields w celu utworzenia w klasie metod set/get dla pól. Upewnij się, że pola wyboru dla wszystkich metod set/get są zaznaczone. Odznacz pole Preview all changes, aby zmiany nie wymagały potwierdzenia i kliknij przycisk Next &gt;.


[[Image:ZAWWW-2st1_2-l07_tresc-1_0_09.png]]
[[Image:ZAWWW-2st1_2-l07_tresc-1_0_09.png]]
Linia 104: Linia 104:
4. Dodanie w klasie Main kodu zapisującego obiekty Bug do bazy danych i odczytującego obiekty Bug z bazy danych.
4. Dodanie w klasie Main kodu zapisującego obiekty Bug do bazy danych i odczytującego obiekty Bug z bazy danych.


a) Przejdź do edycji pliku Main.java. W oknie edycji klasy Main prawym klawiszem myszy wywołaj menu kontekstowe i wybierz opcję Persistence-> Use Entity Manager. Operacja ta spowoduje dodanie w klasie Main kodu tworzącego obiekt EntityManagerFactory i metody persist() ilustrującej sposób tworzenia obiektu EntityManager i realizacji transakcji.
a) Przejdź do edycji pliku Main.java. W oknie edycji klasy Main prawym klawiszem myszy wywołaj menu kontekstowe i wybierz opcję Persistence-&gt; Use Entity Manager. Operacja ta spowoduje dodanie w klasie Main kodu tworzącego obiekt EntityManagerFactory i metody persist() ilustrującej sposób tworzenia obiektu EntityManager i realizacji transakcji.


b) Dodaj do kodu klasy Main dyrektywy import importujące klasy z pakietu encje i klasę biblioteczną java.util.Collection:
b) Dodaj do kodu klasy Main dyrektywy import importujące klasy z pakietu encje i klasę biblioteczną java.util.List:


<tt>
<tt>


{|border="2" cellspacing="0" cellpadding="4" width="100%"
{|border="2" cellspacing="0" cellpadding="4" width="100%"
|align = "justify"|'''&nbsp;&nbsp;&nbsp;&nbsp;import'''&nbsp;encje.*;<br>&nbsp;&nbsp;&nbsp;&nbsp;'''import'''&nbsp;java.util.Collection;
|align = "justify"|'''&nbsp;&nbsp;&nbsp;&nbsp;import'''&nbsp;encje.<nowiki>*</nowiki>;<br>&nbsp;&nbsp;&nbsp;&nbsp;'''import'''&nbsp;java.util.List;
|-
|-
|}
|}
Linia 122: Linia 122:


{|border="2" cellspacing="0" cellpadding="4" width="100%"
{|border="2" cellspacing="0" cellpadding="4" width="100%"
|align = "justify"|'''&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;'''addBug(String&nbsp;pNum,&nbsp;String&nbsp;pDesc)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EntityManager&nbsp;em&nbsp;=&nbsp;emf.createEntityManager();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;em.getTransaction().begin();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'''try'''&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bug&nbsp;b&nbsp;=&nbsp;new&nbsp;Bug();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.setNum(pNum);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.setDescription(pDesc);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;em.persist(b);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;em.getTransaction().commit();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;'''catch'''&nbsp;(Exception&nbsp;e)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;em.getTransaction().rollback();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;'''finally'''&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;em.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}
|align = "justify"|'''&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;'''addBug(String&nbsp;pNum,&nbsp;String&nbsp;pDesc)&nbsp;<nowiki>{</nowiki><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EntityManager&nbsp;em&nbsp;=&nbsp;emf.createEntityManager();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;em.getTransaction().begin();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'''try'''&nbsp;<nowiki>{</nowiki><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bug&nbsp;b&nbsp;=&nbsp;new&nbsp;Bug();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.setNum(pNum);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.setDescription(pDesc);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;em.persist(b);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;em.getTransaction().commit();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<nowiki>}</nowiki>&nbsp;'''catch'''&nbsp;(Exception&nbsp;e)&nbsp;<nowiki>{</nowiki><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;em.getTransaction().rollback();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<nowiki>}</nowiki>&nbsp;'''finally'''&nbsp;<nowiki>{</nowiki><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;em.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<nowiki>}</nowiki><br>&nbsp;&nbsp;&nbsp;&nbsp;<nowiki>}</nowiki>
|-
|-
|}
|}
Linia 133: Linia 133:


{|border="2" cellspacing="0" cellpadding="4" width="100%"
{|border="2" cellspacing="0" cellpadding="4" width="100%"
|align = "justify"|'''&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;'''Collection<Bug>&nbsp;findBugs(String&nbsp;pKeyword)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EntityManager&nbsp;em&nbsp;=&nbsp;emf.createEntityManager();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Collection<Bug>&nbsp;wyn&nbsp;=&nbsp;null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'''try'''&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wyn&nbsp;=&nbsp;em.createNamedQuery("findByKeyword")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.setParameter("keyword",&nbsp;pKeyword).getResultList();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;'''catch'''&nbsp;(Exception&nbsp;e)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;'''finally'''&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;em.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'''return'''&nbsp;wyn;<br>&nbsp;&nbsp;&nbsp;&nbsp;}
|align = "justify"|'''&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;'''List&lt;Bug&gt;&nbsp;findBugs(String&nbsp;pKeyword)&nbsp;<nowiki>{</nowiki><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EntityManager&nbsp;em&nbsp;=&nbsp;emf.createEntityManager();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Bug&gt;&nbsp;wyn&nbsp;=&nbsp;null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'''try'''&nbsp;<nowiki>{</nowiki><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wyn&nbsp;=&nbsp;em.createNamedQuery("findByKeyword")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.setParameter("keyword",&nbsp;pKeyword).getResultList();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<nowiki>}</nowiki>&nbsp;'''catch'''&nbsp;(Exception&nbsp;e)&nbsp;<nowiki>{</nowiki><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<nowiki>}</nowiki>&nbsp;'''finally'''&nbsp;<nowiki>{</nowiki><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;em.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<nowiki>}</nowiki><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'''return'''&nbsp;wyn;<br>&nbsp;&nbsp;&nbsp;&nbsp;<nowiki>}</nowiki>
|-
|-
|}
|}
Linia 144: Linia 144:


{|border="2" cellspacing="0" cellpadding="4" width="100%"
{|border="2" cellspacing="0" cellpadding="4" width="100%"
|align = "justify"|'''&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;'''Collection<Bug>&nbsp;findBugs(String&nbsp;pKeyword)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EntityManager&nbsp;em&nbsp;=&nbsp;emf.createEntityManager();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Collection<Bug>&nbsp;wyn&nbsp;=&nbsp;null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'''try'''&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wyn&nbsp;=&nbsp;em.createNamedQuery("findByKeyword")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.setParameter("keyword",&nbsp;pKeyword).getResultList();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;'''catch'''&nbsp;(Exception&nbsp;e)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;'''finally'''&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;em.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'''return'''&nbsp;wyn;<br>&nbsp;&nbsp;&nbsp;&nbsp;}
|align = "justify"|'''&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void'''&nbsp;main(String<nowiki>[]</nowiki>&nbsp;args)&nbsp;<nowiki>{</nowiki><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addBug("b001",&nbsp;"Database&nbsp;server&nbsp;process&nbsp;does&nbsp;not&nbsp;start");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addBug("b002",&nbsp;"Database&nbsp;open()&nbsp;does&nbsp;not&nbsp;work");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addBug("b003",&nbsp;"Execution&nbsp;slow&nbsp;when&nbsp;on&nbsp;battery");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'''for'''&nbsp;(Bug&nbsp;b&nbsp;:&nbsp;findBugs("%base%"))&nbsp;<nowiki>{</nowiki><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Num:"&nbsp;<nowiki>+</nowiki>&nbsp;b.getNum()&nbsp;<nowiki>+</nowiki><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"&nbsp;Desc:&nbsp;"&nbsp;<nowiki>+</nowiki>&nbsp;b.getDescription());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<nowiki>}</nowiki><br>&nbsp;&nbsp;&nbsp;&nbsp;<nowiki>}</nowiki>
|-
|-
|}
|}
Linia 154: Linia 154:
[[Image:ZAWWW-2st1_2-l07_tresc-1_0_10.png]]
[[Image:ZAWWW-2st1_2-l07_tresc-1_0_10.png]]


j) Zapisz wszystkie zmiany (File->Save All lub ikona w pasku narzędzi).
j) Zapisz wszystkie zmiany (File-&gt;Save All lub ikona w pasku narzędzi).


g) Uruchom wbudowany serwer bazy danych wybierając z menu głównego opcję Tools->Java DB Database -> Start Java DB Server.
g) Uruchom wbudowany serwer bazy danych wybierając z menu głównego opcję Tools-&gt;Java DB Database -&gt; Start Java DB Server.


[[Image:ZAWWW-2st1_2-l07_tresc-1_0_11.png]]
[[Image:ZAWWW-2st1_2-l07_tresc-1_0_11.png]]
Linia 175: Linia 175:
a) Uruchom narzędzie NetBeans IDE 5.5
a) Uruchom narzędzie NetBeans IDE 5.5


b) Z menu głównego wybierz File->New Project. Wybierz kategorię Web i typ projektu Web Application. Kliknij przycisk Next >.
b) Z menu głównego wybierz File-&gt;New Project. Wybierz kategorię Web i typ projektu Web Application. Kliknij przycisk Next &gt;.


<tt>
<tt>
Linia 190: Linia 190:
----
----


c) Podaj nazwę projektu, „AlbumyJP". Zwróć uwagę, że wraz zmianą nazwy projektu zmienia się Context Path czyli katalog wirtualny na serwerze WWW, który będzie prowadził do aplikacji. W polu Project Location powinien być wskazany katalog, w którym masz prawo zapisu. Jako Server powinien być wybrany Sun Java System Application Server a jako J2EE Version – Java EE 5. Kliknij przycisk Next >.
c) Podaj nazwę projektu, „AlbumyJP". Zwróć uwagę, że wraz zmianą nazwy projektu zmienia się Context Path czyli katalog wirtualny na serwerze WWW, który będzie prowadził do aplikacji. W polu Project Location powinien być wskazany katalog, w którym masz prawo zapisu. Jako Server powinien być wybrany Sun Java System Application Server a jako J2EE Version – Java EE 5. Kliknij przycisk Next &gt;.


<tt>
<tt>
Linia 218: Linia 218:
2. Utworzenie jednostki trwałości, w ramach której obiekty aplikacji będą zachowywane w bazie danych
2. Utworzenie jednostki trwałości, w ramach której obiekty aplikacji będą zachowywane w bazie danych


a) Kliknij prawym przyciskiem myszy na ikonie projektu w drzewie projektów i z menu kontekstowego wybierz New->File/Folder. Kliknij przycisk Next >.
a) Kliknij prawym przyciskiem myszy na ikonie projektu w drzewie projektów i z menu kontekstowego wybierz New-&gt;File/Folder. Kliknij przycisk Next &gt;.


[[Image:ZAWWW-2st1_2-l07_tresc-1_0_15.png]]
[[Image:ZAWWW-2st1_2-l07_tresc-1_0_15.png]]
Linia 230: Linia 230:
[[Image:ZAWWW-2st1_2-l07_tresc-1_0_17.png]]
[[Image:ZAWWW-2st1_2-l07_tresc-1_0_17.png]]


d) Obejrzyj zawartość wygenerowanego przez kreator pliku persistence.xml w trybie XML. Zwróć uwagę na elementy <provider> i <jta-data-source> zawierające wartości odpowiadające opcjom wybranym z list rozwijanych w oknie kreatora.
d) Obejrzyj zawartość wygenerowanego przez kreator pliku persistence.xml w trybie XML. Zwróć uwagę na elementy &lt;provider&gt; i &lt;jta-data-source&gt; zawierające wartości odpowiadające opcjom wybranym z list rozwijanych w oknie kreatora.


<tt>
<tt>
Linia 245: Linia 245:
3. Utworzenie klas encji Album i Wykonawca. Z każdym albumem będzie związany jeden wykonawca. Każdy wykonawca będzie posiadał kolekcję albumów.
3. Utworzenie klas encji Album i Wykonawca. Z każdym albumem będzie związany jeden wykonawca. Każdy wykonawca będzie posiadał kolekcję albumów.


a) Kliknij prawym przyciskiem myszy na ikonie projektu w drzewie projektów i z menu kontekstowego wybierz New->File/Folder. Kliknij przycisk Next >.
a) Kliknij prawym przyciskiem myszy na ikonie projektu w drzewie projektów i z menu kontekstowego wybierz New-&gt;File/Folder. Kliknij przycisk Next &gt;.


b) Następnie wybierz kategorię Persistence i typ pliku Entity Class. Kliknij przycisk Next >.
b) Następnie wybierz kategorię Persistence i typ pliku Entity Class. Kliknij przycisk Next &gt;.


c) Jako nazwę klasy podaj „Album", a jako nazwę pakietu „encje". Pozostaw Long jako typ klucza głównego (Primary Key Type). Kliknij przycisk Finish.
c) Jako nazwę klasy podaj „Album", a jako nazwę pakietu „encje". Pozostaw Long jako typ klucza głównego (Primary Key Type). Kliknij przycisk Finish.
Linia 260: Linia 260:


{|border="2" cellspacing="0" cellpadding="4" width="100%"
{|border="2" cellspacing="0" cellpadding="4" width="100%"
|align = "justify"|@Entity<br>@Table(name="ALBUMY")<br>'''public&nbsp;class&nbsp;'''Album'''&nbsp;implements&nbsp;'''Serializable&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;@Id<br>&nbsp;&nbsp;&nbsp;&nbsp;@GeneratedValue(strategy&nbsp;=&nbsp;GenerationType.AUTO)<br>&nbsp;&nbsp;&nbsp;&nbsp;'''private'''&nbsp;Long&nbsp;id;<br>&nbsp;&nbsp;&nbsp;&nbsp;'''private'''&nbsp;String&nbsp;tytul;<br>&nbsp;&nbsp;&nbsp;&nbsp;'''private'''&nbsp;Wykonawca&nbsp;wykonawca;<br>'''...'''
|align = "justify"|@Entity<br>@Table(name="ALBUMY")<br>'''public&nbsp;class&nbsp;'''Album'''&nbsp;implements&nbsp;'''Serializable&nbsp;<nowiki>{</nowiki><br><br>&nbsp;&nbsp;&nbsp;&nbsp;@Id<br>&nbsp;&nbsp;&nbsp;&nbsp;@GeneratedValue(strategy&nbsp;=&nbsp;GenerationType.AUTO)<br>&nbsp;&nbsp;&nbsp;&nbsp;'''private'''&nbsp;Long&nbsp;id;<br>&nbsp;&nbsp;&nbsp;&nbsp;'''private'''&nbsp;String&nbsp;tytul;<br>&nbsp;&nbsp;&nbsp;&nbsp;'''private'''&nbsp;Wykonawca&nbsp;wykonawca;<br>'''...'''
|-
|-
|}
|}
Linia 266: Linia 266:
</tt>
</tt>


f) W oknie edycji klasy Album prawym klawiszem myszy wywołaj menu kontekstowe i wybierz opcję Refactor->Encapsulate fields w celu utworzenia w klasie metod set/get dla pól. Upewnij się, że pola wyboru dla wszystkich metod set/get są zaznaczone. Odznacz pole Preview all changes, aby zmiany nie wymagały potwierdzenia i kliknij przycisk Next >.
f) W oknie edycji klasy Album prawym klawiszem myszy wywołaj menu kontekstowe i wybierz opcję Refactor-&gt;Encapsulate fields w celu utworzenia w klasie metod set/get dla pól. Upewnij się, że pola wyboru dla wszystkich metod set/get są zaznaczone. Odznacz pole Preview all changes, aby zmiany nie wymagały potwierdzenia i kliknij przycisk Next &gt;.


<tt>
<tt>
Linia 281: Linia 281:
g) Obejrzyj w kodzie klasy wygenerowane metody.
g) Obejrzyj w kodzie klasy wygenerowane metody.


h) W celu utworzenia drugiej klasy, ponownie kliknij prawym przyciskiem myszy na ikonie projektu w drzewie projektów i z menu kontekstowego wybierz New->File/Folder. Kliknij przycisk Next >.
h) W celu utworzenia drugiej klasy, ponownie kliknij prawym przyciskiem myszy na ikonie projektu w drzewie projektów i z menu kontekstowego wybierz New-&gt;File/Folder. Kliknij przycisk Next &gt;.


i) Następnie wybierz kategorię Persistence i typ pliku Entity Class. Kliknij przycisk Next >.
i) Następnie wybierz kategorię Persistence i typ pliku Entity Class. Kliknij przycisk Next &gt;.


j) Jako nazwę klasy podaj Wykonawca, a jako nazwę pakietu encje. Pozostaw Long jako typ klucza głównego (Primary Key Type). Kliknij przycisk Finish.
j) Jako nazwę klasy podaj Wykonawca, a jako nazwę pakietu encje. Pozostaw Long jako typ klucza głównego (Primary Key Type). Kliknij przycisk Finish.
Linia 289: Linia 289:
k) Przejdź do edycji utworzonego pliku Wykonawca.java. Pod adnotacją @Entity dodaj wiersz z adnotacją @Table(name="WYKONAWCY"). Zaimportuj klasę javax.persistence.Table podobnie jak wcześniej dla klasy Album.
k) Przejdź do edycji utworzonego pliku Wykonawca.java. Pod adnotacją @Entity dodaj wiersz z adnotacją @Table(name="WYKONAWCY"). Zaimportuj klasę javax.persistence.Table podobnie jak wcześniej dla klasy Album.


l) Dodaj w klasie Wykonawca (poniżej pola id) dwa prywatne pola nazwa typu String i albumy typu Collection<Album> (nie zapomnij o zaimportowaniu java.util.Collection).
l) Dodaj w klasie Wykonawca (poniżej pola id) dwa prywatne pola nazwa typu String i albumy typu Collection&lt;Album&gt; (nie zapomnij o zaimportowaniu java.util.Collection).


<tt>
<tt>


{|border="2" cellspacing="0" cellpadding="4" width="100%"
{|border="2" cellspacing="0" cellpadding="4" width="100%"
|align = "justify"|@Entity<br>@Table(name="WYKONAWCY")<br>'''public&nbsp;class'''&nbsp;Wykonawca&nbsp;'''implements'''&nbsp;Serializable&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;@Id<br>&nbsp;&nbsp;&nbsp;&nbsp;@GeneratedValue(strategy&nbsp;=&nbsp;GenerationType.AUTO)<br>&nbsp;&nbsp;&nbsp;&nbsp;'''private'''&nbsp;Long&nbsp;id;<br>&nbsp;&nbsp;&nbsp;&nbsp;'''private'''&nbsp;String&nbsp;nazwa;<br>&nbsp;&nbsp;&nbsp;&nbsp;'''private'''&nbsp;Collection<Album>&nbsp;albumy;<br><br>'''...'''
|align = "justify"|@Entity<br>@Table(name="WYKONAWCY")<br>'''public&nbsp;class'''&nbsp;Wykonawca&nbsp;'''implements'''&nbsp;Serializable&nbsp;<nowiki>{</nowiki><br><br>&nbsp;&nbsp;&nbsp;&nbsp;@Id<br>&nbsp;&nbsp;&nbsp;&nbsp;@GeneratedValue(strategy&nbsp;=&nbsp;GenerationType.AUTO)<br>&nbsp;&nbsp;&nbsp;&nbsp;'''private'''&nbsp;Long&nbsp;id;<br>&nbsp;&nbsp;&nbsp;&nbsp;'''private'''&nbsp;String&nbsp;nazwa;<br>&nbsp;&nbsp;&nbsp;&nbsp;'''private'''&nbsp;Collection&lt;Album&gt;&nbsp;albumy;<br><br>'''...'''
|-
|-
|}
|}
Linia 300: Linia 300:
</tt>
</tt>


m) W oknie edycji klasy Wykonawca prawym klawiszem myszy wywołaj menu kontekstowe i wybierz opcję Refactor->Encapsulate fields w celu utworzenia w klasie metod set/get dla pól. Upewnij się, że pola wyboru dla wszystkich metod set/get są zaznaczone. Odznacz pole Preview all changes, aby zmiany nie wymagały potwierdzenia i kliknij przycisk Next >.
m) W oknie edycji klasy Wykonawca prawym klawiszem myszy wywołaj menu kontekstowe i wybierz opcję Refactor-&gt;Encapsulate fields w celu utworzenia w klasie metod set/get dla pól. Upewnij się, że pola wyboru dla wszystkich metod set/get są zaznaczone. Odznacz pole Preview all changes, aby zmiany nie wymagały potwierdzenia i kliknij przycisk Next &gt;.


4. Zdefiniowanie związku 1:N między klasami encji Wykonawca i Album
4. Zdefiniowanie związku 1:N między klasami encji Wykonawca i Album
Linia 309: Linia 309:


{|border="2" cellspacing="0" cellpadding="4" width="100%"
{|border="2" cellspacing="0" cellpadding="4" width="100%"
|align = "justify"|'''&nbsp;&nbsp;&nbsp;&nbsp;'''@OneToMany(mappedBy="wykonawca")<br>&nbsp;&nbsp;&nbsp;&nbsp;'''private'''&nbsp;Collection<Album>&nbsp;albumy;
|align = "justify"|'''&nbsp;&nbsp;&nbsp;&nbsp;'''@OneToMany(mappedBy="wykonawca")<br>&nbsp;&nbsp;&nbsp;&nbsp;'''private'''&nbsp;Collection&lt;Album&gt;&nbsp;albumy;
|-
|-
|}
|}
Linia 328: Linia 328:
5. Ostatnia część ćwiczenia to wygenerowanie za pomocą kreatora aplikacji JSF do
5. Ostatnia część ćwiczenia to wygenerowanie za pomocą kreatora aplikacji JSF do


a) Kliknij prawym przyciskiem myszy na ikonie projektu w drzewie projektów i z menu kontekstowego wybierz New->JSF Pages from Entity Class. Kliknij przycisk Next >.
a) Kliknij prawym przyciskiem myszy na ikonie projektu w drzewie projektów i z menu kontekstowego wybierz New-&gt;JSF Pages from Entity Class. Kliknij przycisk Next &gt;.


b) Wybierz wszystkie encje jako źródło dla aplikacji JSF klikając przycisk Add All.
b) Wybierz wszystkie encje jako źródło dla aplikacji JSF klikając przycisk Add All.
Linia 334: Linia 334:
[[Image:ZAWWW-2st1_2-l07_tresc-1_0_21.png]]
[[Image:ZAWWW-2st1_2-l07_tresc-1_0_21.png]]


c) Kliknij przycisk Next >. W kolejnym oknie pozostaw wszystkie ustawienia domyślne i kliknij przycisk Finish.
c) Kliknij przycisk Next &gt;. W kolejnym oknie pozostaw wszystkie ustawienia domyślne i kliknij przycisk Finish.


d) Wynikiem działania kreatora jest zestaw czterech stron JSF dla każdej encji i towarzyszące im klasy pomocnicze – po dwie dla każdej encji. Rozwiń wszystkie gałęzie drzewa projektu w oknie Projects, aby obejrzeć wygenerowane pliki.
d) Wynikiem działania kreatora jest zestaw czterech stron JSF dla każdej encji i towarzyszące im klasy pomocnicze – po dwie dla każdej encji. Rozwiń wszystkie gałęzie drzewa projektu w oknie Projects, aby obejrzeć wygenerowane pliki.
Linia 344: Linia 344:
f) Usuń z drzewa projektu wygenerowaną wraz z projektem przykładową stronę JSF welcomeJSF.jsp. W tym celu prawym klawiszem myszy wywołaj menu kontekstowe dla pliku w drzewie projektu, a następnie wybierz opcje Delete.
f) Usuń z drzewa projektu wygenerowaną wraz z projektem przykładową stronę JSF welcomeJSF.jsp. W tym celu prawym klawiszem myszy wywołaj menu kontekstowe dla pliku w drzewie projektu, a następnie wybierz opcje Delete.


g) Przejdź do edycji pliku index.jsp i usuń link do strony welcomeJSF.jsp. Zapisz wszystkie dokonane zmiany (File->Save All lub ikona w pasku narzędzi).
g) Przejdź do edycji pliku index.jsp i usuń link do strony welcomeJSF.jsp. Zapisz wszystkie dokonane zmiany (File-&gt;Save All lub ikona w pasku narzędzi).


h) Uruchom aplikację wybierając opcję Run File z menu kontekstowego dla pliku index.jsp.
h) Uruchom aplikację wybierając opcję Run File z menu kontekstowego dla pliku index.jsp.
Linia 365: Linia 365:
a) Uruchom narzędzie NetBeans IDE 5.5
a) Uruchom narzędzie NetBeans IDE 5.5


b) Z menu głównego wybierz File->New Project. Wybierz kategorię General i typ projektu Java Class Library. Kliknij przycisk Next >.
b) Z menu głównego wybierz File-&gt;New Project. Wybierz kategorię General i typ projektu Java Class Library. Kliknij przycisk Next &gt;.


c) Podaj nazwę projektu „OrdersLibrary". W polu Project Location powinien być wskazany katalog, w którym masz prawo zapisu. Kliknij przycisk Finish.
c) Podaj nazwę projektu „OrdersLibrary". W polu Project Location powinien być wskazany katalog, w którym masz prawo zapisu. Kliknij przycisk Finish.
Linia 371: Linia 371:
2. Utworzenie jednostki trwałości, w ramach której obiekty aplikacji będą zachowywane w bazie danych
2. Utworzenie jednostki trwałości, w ramach której obiekty aplikacji będą zachowywane w bazie danych


a) Kliknij prawym przyciskiem myszy na ikonie projektu w drzewie projektów i z menu kontekstowego wybierz New->File/Folder. Kliknij przycisk Next >.
a) Kliknij prawym przyciskiem myszy na ikonie projektu w drzewie projektów i z menu kontekstowego wybierz New-&gt;File/Folder. Kliknij przycisk Next &gt;.


b) Następnie wybierz kategorię Persistence i typ pliku Persistence Unit.
b) Następnie wybierz kategorię Persistence i typ pliku Persistence Unit.
Linia 377: Linia 377:
c) W kolejnym oknie pozostaw wszystkie opcje domyślne. Zwróć uwagę na wybór biblioteki do obsługi trwałości (Persistence Library): TopLink i łańcuch połączenia JDBC (Database Connection), wskazujący bazę danych „wbudowaną" w środowisko NetBeans (Derby). Jako strategię tworzenia tabel w bazie danych (Table Generation Strategy) pozostaw Create, czyli tworzenie w momencie instalacji aplikacji jeśli nie istnieją. Kliknij przycisk Finish.
c) W kolejnym oknie pozostaw wszystkie opcje domyślne. Zwróć uwagę na wybór biblioteki do obsługi trwałości (Persistence Library): TopLink i łańcuch połączenia JDBC (Database Connection), wskazujący bazę danych „wbudowaną" w środowisko NetBeans (Derby). Jako strategię tworzenia tabel w bazie danych (Table Generation Strategy) pozostaw Create, czyli tworzenie w momencie instalacji aplikacji jeśli nie istnieją. Kliknij przycisk Finish.


d) Obejrzyj zawartość wygenerowanego przez kreator pliku persistence.xml w trybie XML. Zwróć uwagę na elementy <provider> i <property> zawierające wartości odpowiadające opcjom wybranym w oknie kreatora. Sprawdź czy zarówno właściwość toplink.jdbc.user i toplink.jdbc.password mają wartość „app" i jeśli nie to popraw zawartość pliku.
d) Obejrzyj zawartość wygenerowanego przez kreator pliku persistence.xml w trybie XML. Zwróć uwagę na elementy &lt;provider&gt; i &lt;property&gt; zawierające wartości odpowiadające opcjom wybranym w oknie kreatora. Sprawdź czy zarówno właściwość toplink.jdbc.user i toplink.jdbc.password mają wartość „app" i jeśli nie to popraw zawartość pliku.


3. Utworzenie za pomocą kreatora zbioru encji na podstawie istniejących tabel w bazie danych.
3. Utworzenie za pomocą kreatora zbioru encji na podstawie istniejących tabel w bazie danych.


a) Kliknij prawym przyciskiem myszy na ikonie projektu w drzewie projektów i z menu kontekstowego wybierz New->File/Folder. Kliknij przycisk Next >.
a) Kliknij prawym przyciskiem myszy na ikonie projektu w drzewie projektów i z menu kontekstowego wybierz New-&gt;File/Folder. Kliknij przycisk Next &gt;.


b) Następnie wybierz kategorię Persistence i typ pliku Entity Classes from Database. Kliknij przycisk Next >.
b) Następnie wybierz kategorię Persistence i typ pliku Entity Classes from Database. Kliknij przycisk Next &gt;.


c) Z listy zdefiniowanych w środowisku NetBeans połączeń z bazą danych wybierz połączenie z wbudowanym serwerem Derby
c) Z listy zdefiniowanych w środowisku NetBeans połączeń z bazą danych wybierz połączenie z wbudowanym serwerem Derby
Linia 393: Linia 393:
[[Image:ZAWWW-2st1_2-l07_tresc-1_0_26.png]]
[[Image:ZAWWW-2st1_2-l07_tresc-1_0_26.png]]


e) Z listy tabel do wyboru, przy zaznaczonym polu wyboru Include related tables, zaznacz myszą tabelę ORDERS i kliknij przycisk Add >.
e) Z listy tabel do wyboru, przy zaznaczonym polu wyboru Include related tables, zaznacz myszą tabelę ORDERS i kliknij przycisk Add &gt;.


[[Image:ZAWWW-2st1_2-l07_tresc-1_0_27.png]]
[[Image:ZAWWW-2st1_2-l07_tresc-1_0_27.png]]


f) Zwróć uwagę, że dzięki opcji Include Related Tables automatycznie zostały wybrane wszystkie tabele tworzące sieć połączeń zawierającą wskazaną tabelę ORDERS. Kliknij przycisk Next >.
f) Zwróć uwagę, że dzięki opcji Include Related Tables automatycznie zostały wybrane wszystkie tabele tworzące sieć połączeń zawierającą wskazaną tabelę ORDERS. Kliknij przycisk Next &gt;.


g) W kolejnym oknie kreatora jako nazwę pakietu wprowadź „encje". Pozostaw zaproponowane nazwy klas encji dla poszczególnych tabel i pozostałe opcje. Kliknij przycisk Finish.
g) W kolejnym oknie kreatora jako nazwę pakietu wprowadź „encje". Pozostaw zaproponowane nazwy klas encji dla poszczególnych tabel i pozostałe opcje. Kliknij przycisk Finish.


h) Obejrzyj wynik działania kreatora. Rozwiń drzewo projektu i obejrzyj wygenerowane klasy encji. Obejrzyj zawartość pliku persistence.xml w trybie XML. Zwróć uwagę na elementy <class> dodane przez kreator, wskazujące wygenerowane klasy jako zarządzane klasy trwałe dla jednostki trwałości OrdersLibraryPU.
h) Obejrzyj wynik działania kreatora. Rozwiń drzewo projektu i obejrzyj wygenerowane klasy encji. Obejrzyj zawartość pliku persistence.xml w trybie XML. Zwróć uwagę na elementy &lt;class&gt; dodane przez kreator, wskazujące wygenerowane klasy jako zarządzane klasy trwałe dla jednostki trwałości OrdersLibraryPU.


[[Image:ZAWWW-2st1_2-l07_tresc-1_0_28.png]]
[[Image:ZAWWW-2st1_2-l07_tresc-1_0_28.png]]


i) Zbuduj projekt, wybierając z menu kontekstowego węzła projektu opcję Build Project. Wynikiem powinien być plik JAR ze skompilowaną biblioteką.
i) Zbuduj projekt, wybierając z menu kontekstowego węzła projektu opcję Build Project. Wynikiem powinien być plik JAR ze skompilowaną biblioteką.

Aktualna wersja na dzień 17:15, 31 sie 2006

Zaawansowane aplikacje internetowe - laboratorium

Java Persistence.

Do wykonania ćwiczeń potrzebne jest zintegrowane środowisko programistyczne NetBeans IDE 5.5 wraz z serwerem Sun Java System Application Server Platform Edition 9 (do pobrania z http://www.netbeans.org/downloads/index.html jako Java EE 5 Tools Bundle) oraz środowisko J2SE w wersji 1.5 Update 1 (lub wyższej) wymagane do instalacji NetBeans. Instalując Java EE 5 Tools Bundle należy zainstalować wszystkie składniki wraz z zawartym w pakiecie serwerem aplikacji (wybór opcji "Install the bundled Java EE SDK" na jednym z ekranów instalatora).

Ćwiczenie 1

Celem ćwiczenia jest przygotowanie prostej aplikacji Java SE realizującej odczyt i zapis danych z/do bazy danych poprzez Java Persistence API.

Kroki ćwiczenia:

1. Utworzenie nowego projektu

a) Uruchom narzędzie NetBeans IDE 5.5

b) Z menu głównego wybierz File->New Project. Wybierz kategorię General i typ projektu Java Application. Kliknij przycisk Next >.

c) Podaj nazwę projektu „BugsJP". W polu Project Location powinien być wskazany katalog, w którym masz prawo zapisu. Pola wyboru Set as Main Project i Create Main Class powinny być zaznaczone. Kliknij przycisk Finish.

d) Efektem działania kreatora powinien być projekt zawierający klasę Java z metodą main().

2. Utworzenie jednostki trwałości, w ramach której obiekty aplikacji będą zachowywane w bazie danych

a) Kliknij prawym przyciskiem myszy na ikonie projektu w drzewie projektów i z menu kontekstowego wybierz New->File/Folder. Kliknij przycisk Next >.

b) Następnie wybierz kategorię Persistence i typ pliku Persistence Unit.

c) W kolejnym oknie pozostaw wszystkie opcje domyślne. Zwróć uwagę na wybór biblioteki do obsługi trwałości (Persistence Library): TopLink i łańcuch połączenia JDBC (Database Connection), wskazujący bazę danych „wbudowaną" w środowisko NetBeans (Derby). Jako strategię tworzenia tabel w bazie danych (Table Generation Strategy) pozostaw Create, czyli tworzenie w momencie instalacji aplikacji jeśli nie istnieją. Kliknij przycisk Finish.

d) Obejrzyj zawartość wygenerowanego przez kreator pliku persistence.xml w trybie XML. Zwróć uwagę na elementy <provider> i <property> zawierające wartości odpowiadające opcjom wybranym w oknie kreatora. Sprawdź czy zarówno właściwość toplink.jdbc.user i toplink.jdbc.password mają wartość „app" i jeśli nie to popraw zawartość pliku.

3. Utworzenie klasy encji Bug. Z każdym albumem będzie związany jeden wykonawca. Każdy wykonawca będzie posiadał kolekcję albumów.

a) Kliknij prawym przyciskiem myszy na ikonie projektu w drzewie projektów i z menu kontekstowego wybierz New->File/Folder. Kliknij przycisk Next >.

b) Następnie wybierz kategorię Persistence i typ pliku Entity Class. Kliknij przycisk Next >.

c) Jako nazwę klasy podaj Bug, a jako nazwę pakietu encje. Pozostaw Long jako typ klucza głównego (Primary Key Type). Kliknij przycisk Finish.

d) Ponownie obejrzyj zawartość pliku persistence.xml w trybie XML. Zwróć uwagę na element <class> dodany przez kreator tworzenia klasy encji. Atrybut ten oznacza, że utworzona klasa encji została wskazana jako zarządzana klasa trwała dla jednostki trwałości BugsJPPU.

e) Przejdź do edycji utworzonego pliku Bug.java. Pod adnotacją @Entity dodaj wiersz z adnotacją @Table(name="BUGS"), aby obiekty klasy były składowane w tabeli o nazwie BUGS (domyślnie nazwa tabeli byłaby taka jak nazwa klasy – w liczbie pojedynczej). Jeśli wprowadzona adnotacja zostanie podkreślona jako błąd, będąc kursorem w wierszu z adnotacją naciśnij kombinację klawiszy Alt-Enter i wybierz zaproponowaną opcję Add import for javax.persistence.Table.

f) Dodaj w klasie Bug (poniżej pola id) dwa prywatne pola num typu String i description typu String.

@Entity
@Table(name="BUGS")
public class Bug implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String num;
    private String description;
...

g) W oknie edycji klasy Bug prawym klawiszem myszy wywołaj menu kontekstowe i wybierz opcję Refactor->Encapsulate fields w celu utworzenia w klasie metod set/get dla pól. Upewnij się, że pola wyboru dla wszystkich metod set/get są zaznaczone. Odznacz pole Preview all changes, aby zmiany nie wymagały potwierdzenia i kliknij przycisk Next >.

h) Obejrzyj w kodzie klasy wygenerowane metody.

i) Zdefiniuj w klasie encji Bug nazwane zapytanie do wyszukiwania błędów zawierających w opisie podane słowo kluczowe poprzez umieszczenie bezpośrednio po wierszu z adnotacją @Table wiersza z poniższą adnotacją @NamedQuery:

    @NamedQuery(name = "findByKeyword", query = "SELECT b FROM Bug b WHERE b.description LIKE :keyword")

4. Dodanie w klasie Main kodu zapisującego obiekty Bug do bazy danych i odczytującego obiekty Bug z bazy danych.

a) Przejdź do edycji pliku Main.java. W oknie edycji klasy Main prawym klawiszem myszy wywołaj menu kontekstowe i wybierz opcję Persistence-> Use Entity Manager. Operacja ta spowoduje dodanie w klasie Main kodu tworzącego obiekt EntityManagerFactory i metody persist() ilustrującej sposób tworzenia obiektu EntityManager i realizacji transakcji.

b) Dodaj do kodu klasy Main dyrektywy import importujące klasy z pakietu encje i klasę biblioteczną java.util.List:

    import encje.*;
    import java.util.List;

c) Zastąp kod metodę persist() poniższą metodą addBug(), tworzącą obiekt Bug na podstawie podanego numeru i opisu, a następnie zapisującą go do bazy danych.

    public static void addBug(String pNum, String pDesc) {
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        try {
          Bug b = new Bug();
          b.setNum(pNum);
          b.setDescription(pDesc);
          em.persist(b);
          em.getTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
            em.getTransaction().rollback();
        } finally {
            em.close();
        }
    }

d) Dodaj w klasie Main metodę findBugs(), wyszukującą w bazie danych błędy, których opisy zawierają podane słowo kluczowe, poprzez nazwane zapytanie zdefiniowane w klasie encji.

    public static List<Bug> findBugs(String pKeyword) {
        EntityManager em = emf.createEntityManager();
        List<Bug> wyn = null;
        try {
          wyn = em.createNamedQuery("findByKeyword")
                  .setParameter("keyword", pKeyword).getResultList();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            em.close();
        }
        return wyn;
    }

e) Dodaj w metodzie main() klasy Main kod zapisujący do bazy danych kilka obiektów Bug metodą addBug(), a następnie wyszukujący obiekty Bug metodą findBugs() i wyświetlający wyniki wyszukiwania na konsoli, np.:

    public static void main(String[] args) {
        addBug("b001", "Database server process does not start");
        addBug("b002", "Database open() does not work");
        addBug("b003", "Execution slow when on battery");
        for (Bug b : findBugs("%base%")) {
          System.out.println("Num:" + b.getNum() +
                             " Desc: " + b.getDescription());
        }
    }

f) Dodaj do projektu bibliotekę wymaganą do współpracy z wbudowaną w NetBeans bazą danych. W tym celu wywołaj dla węzła Libraries w drzewie projektu opcję Add Library, a następnie z listy dostępnych bibliotek wybierz Java DB Driver i kliknij przycisk Add Library.

j) Zapisz wszystkie zmiany (File->Save All lub ikona w pasku narzędzi).

g) Uruchom wbudowany serwer bazy danych wybierając z menu głównego opcję Tools->Java DB Database -> Start Java DB Server.

h) Uruchom aplikację wybierając opcję Run Project z menu kontekstowego dla projektu. Wyświetlone na konsoli dane odczytane z bazy danych mogą być poprzedzone komunikatami informacyjnymi i ostrzeżeniami zgłaszanymi przez Toplink.

Ćwiczenie 2

Celem ćwiczenia jest:

1) przygotowanie modelu obiektowego dla aplikacji obejmującego dwie powiązane ze sobą encje i odwzorowanie go w schemat relacyjnej bazy danych;

2) wygenerowanie za pomocą kreatora aplikacji Java EE opartej o JSF pracującej na utworzonym modelu i obsługującej trwałość poprzez Java Persistence API.

Kroki ćwiczenia:

1. Utworzenie nowego projektu

a) Uruchom narzędzie NetBeans IDE 5.5

b) Z menu głównego wybierz File->New Project. Wybierz kategorię Web i typ projektu Web Application. Kliknij przycisk Next >.


c) Podaj nazwę projektu, „AlbumyJP". Zwróć uwagę, że wraz zmianą nazwy projektu zmienia się Context Path czyli katalog wirtualny na serwerze WWW, który będzie prowadził do aplikacji. W polu Project Location powinien być wskazany katalog, w którym masz prawo zapisu. Jako Server powinien być wybrany Sun Java System Application Server a jako J2EE Version – Java EE 5. Kliknij przycisk Next >.

d) Zaznacz Java Server Faces w panelu Frameworks. Krok ten jest niezbędny, gdyż w ostatnim etapie ćwiczenia do prezentacji danych z bazy danych będzie wykorzystana aplikacja WWW oparta o JSF. Kliknij przycisk Finish.

2. Utworzenie jednostki trwałości, w ramach której obiekty aplikacji będą zachowywane w bazie danych

a) Kliknij prawym przyciskiem myszy na ikonie projektu w drzewie projektów i z menu kontekstowego wybierz New->File/Folder. Kliknij przycisk Next >.

b) Następnie wybierz kategorię Persistence i typ pliku Persistence Unit.

c) W kolejnym oknie pozostaw wszystkie opcje domyślne. Zwróć uwagę na wybór dostawcy usług trwałości (Persistence Provider): TopLink (alternatywą jest m.in. Hibernate) i źródło danych jdbc/sample, reprezentujące bazę danych „wbudowaną" w środowisko NetBeans. Upewnij się, że pole wyboru Use Java Transaction API jest zaznaczone. Jako strategię tworzenia tabel w bazie danych (Table Generation Strategy) pozostaw Create, czyli tworzenie w momencie instalacji aplikacji jeśli nie istnieją. Kliknij przycisk Finish.

d) Obejrzyj zawartość wygenerowanego przez kreator pliku persistence.xml w trybie XML. Zwróć uwagę na elementy <provider> i <jta-data-source> zawierające wartości odpowiadające opcjom wybranym z list rozwijanych w oknie kreatora.

3. Utworzenie klas encji Album i Wykonawca. Z każdym albumem będzie związany jeden wykonawca. Każdy wykonawca będzie posiadał kolekcję albumów.

a) Kliknij prawym przyciskiem myszy na ikonie projektu w drzewie projektów i z menu kontekstowego wybierz New->File/Folder. Kliknij przycisk Next >.

b) Następnie wybierz kategorię Persistence i typ pliku Entity Class. Kliknij przycisk Next >.

c) Jako nazwę klasy podaj „Album", a jako nazwę pakietu „encje". Pozostaw Long jako typ klucza głównego (Primary Key Type). Kliknij przycisk Finish.

d) Przejdź do edycji utworzonego pliku Album.java. Pod adnotacją @Entity dodaj wiersz z adnotacją @Table(name="ALBUMY"), aby obiekty klasy były składowane w tabeli o nazwie ALBUMY (domyślnie nazwa tabeli byłaby taka jak nazwa klasy – w liczbie pojedynczej). Jeśli wprowadzona adnotacja zostanie podkreślona jako błąd, będąc kursorem w wierszu z adnotacją naciśnij kombinację klawiszy Alt-Enter i wybierz zaproponowaną opcję Add import for javax.persistence.Table.

e) Dodaj w klasie Album (poniżej pola id) dwa prywatne pola tytu" typu String i wykonawca typu Wykonawca. Nie przejmuj się tym, że pole wykonawca zostało oznaczone jako błąd. Błąd ten wynika z faktu użycia jako typu pola klasy Wykonawca, która jeszcze nie została utworzona.

@Entity
@Table(name="ALBUMY")
public class Album implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String tytul;
    private Wykonawca wykonawca;
...

f) W oknie edycji klasy Album prawym klawiszem myszy wywołaj menu kontekstowe i wybierz opcję Refactor->Encapsulate fields w celu utworzenia w klasie metod set/get dla pól. Upewnij się, że pola wyboru dla wszystkich metod set/get są zaznaczone. Odznacz pole Preview all changes, aby zmiany nie wymagały potwierdzenia i kliknij przycisk Next >.

g) Obejrzyj w kodzie klasy wygenerowane metody.

h) W celu utworzenia drugiej klasy, ponownie kliknij prawym przyciskiem myszy na ikonie projektu w drzewie projektów i z menu kontekstowego wybierz New->File/Folder. Kliknij przycisk Next >.

i) Następnie wybierz kategorię Persistence i typ pliku Entity Class. Kliknij przycisk Next >.

j) Jako nazwę klasy podaj Wykonawca, a jako nazwę pakietu encje. Pozostaw Long jako typ klucza głównego (Primary Key Type). Kliknij przycisk Finish.

k) Przejdź do edycji utworzonego pliku Wykonawca.java. Pod adnotacją @Entity dodaj wiersz z adnotacją @Table(name="WYKONAWCY"). Zaimportuj klasę javax.persistence.Table podobnie jak wcześniej dla klasy Album.

l) Dodaj w klasie Wykonawca (poniżej pola id) dwa prywatne pola nazwa typu String i albumy typu Collection<Album> (nie zapomnij o zaimportowaniu java.util.Collection).

@Entity
@Table(name="WYKONAWCY")
public class Wykonawca implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String nazwa;
    private Collection<Album> albumy;

...

m) W oknie edycji klasy Wykonawca prawym klawiszem myszy wywołaj menu kontekstowe i wybierz opcję Refactor->Encapsulate fields w celu utworzenia w klasie metod set/get dla pól. Upewnij się, że pola wyboru dla wszystkich metod set/get są zaznaczone. Odznacz pole Preview all changes, aby zmiany nie wymagały potwierdzenia i kliknij przycisk Next >.

4. Zdefiniowanie związku 1:N między klasami encji Wykonawca i Album

a) Oznacz w klasie Wykonawca pole albumy adnotacją @OneToMany(mappedBy="wykonawca"). Zaimportuj klasę adnotacji jak wcześniej dla adnotacji @Table.

    @OneToMany(mappedBy="wykonawca")
    private Collection<Album> albumy;

b) Oznacz w klasie Album pole wykonawca adnotacją @ManyToOne. Zaimportuj klasę adnotacji.

    @ManyToOne
    private Wykonawca wykonawca;

5. Ostatnia część ćwiczenia to wygenerowanie za pomocą kreatora aplikacji JSF do

a) Kliknij prawym przyciskiem myszy na ikonie projektu w drzewie projektów i z menu kontekstowego wybierz New->JSF Pages from Entity Class. Kliknij przycisk Next >.

b) Wybierz wszystkie encje jako źródło dla aplikacji JSF klikając przycisk Add All.

c) Kliknij przycisk Next >. W kolejnym oknie pozostaw wszystkie ustawienia domyślne i kliknij przycisk Finish.

d) Wynikiem działania kreatora jest zestaw czterech stron JSF dla każdej encji i towarzyszące im klasy pomocnicze – po dwie dla każdej encji. Rozwiń wszystkie gałęzie drzewa projektu w oknie Projects, aby obejrzeć wygenerowane pliki.

e) Dla każdej encji wygenerowane zostały cztery strony JSF (Detail.jsp, Edit.jsp, List.jsp, New.jsp), umożliwiające przeglądanie, edycję, dodawanie i usuwanie wykonawców i albumów. W celu zapoznania się z efektem działania kreatora otwórz plik album/List.jsp. Jest to strona JSF, której komponenty interfejsu odwołują się do zarządzanego komponentu JavaBean o nazwie album. Następnie otwórz plik konfiguracyjny aplikacji JSF faces-config.xml. Znajdź deklarację zarządzanego komponentu album. Jest on obiektem wygenerowanej przez kreator klasy AlbumController obsługującej komunikację z bazą danych dla encji Album. Podejrzyj źródło klasy AlbumController. Znajdź w klasie adnotacje wstrzykujące obiekty UserTransaction i EntityManagerFactory. Obejrzyj wywołania metod Java Persistence API w metodach klasy.

f) Usuń z drzewa projektu wygenerowaną wraz z projektem przykładową stronę JSF welcomeJSF.jsp. W tym celu prawym klawiszem myszy wywołaj menu kontekstowe dla pliku w drzewie projektu, a następnie wybierz opcje Delete.

g) Przejdź do edycji pliku index.jsp i usuń link do strony welcomeJSF.jsp. Zapisz wszystkie dokonane zmiany (File->Save All lub ikona w pasku narzędzi).

h) Uruchom aplikację wybierając opcję Run File z menu kontekstowego dla pliku index.jsp.

i) Dodaj dwóch wykonawców, a następnie po dwa albumy dla każdego z nich. Przykładowo, w celu dodania wykonawcy wybierz link List of wykonawca, następnie New Wykonawca, wprowadź nazwę i wybierz link Create.

Uwaga: Wygenerowana aplikacja zawiera teksty w języku angielskim. Oczywiście można zmodyfikować kod poszczególnych stron tłumacząc teksty nagłówków i opisy linków na język polski.

Ćwiczenie 3

Celem ćwiczenia jest wygenerowanie biblioteki klas encji dla istniejącego schematu relacyjnej bazy danych. Taka biblioteka może następnie być wykorzystywana i współdzielona przez aplikacje Java SE i Java EE działające na bazie danych.

Kroki ćwiczenia:

1. Utworzenie nowego projektu

a) Uruchom narzędzie NetBeans IDE 5.5

b) Z menu głównego wybierz File->New Project. Wybierz kategorię General i typ projektu Java Class Library. Kliknij przycisk Next >.

c) Podaj nazwę projektu „OrdersLibrary". W polu Project Location powinien być wskazany katalog, w którym masz prawo zapisu. Kliknij przycisk Finish.

2. Utworzenie jednostki trwałości, w ramach której obiekty aplikacji będą zachowywane w bazie danych

a) Kliknij prawym przyciskiem myszy na ikonie projektu w drzewie projektów i z menu kontekstowego wybierz New->File/Folder. Kliknij przycisk Next >.

b) Następnie wybierz kategorię Persistence i typ pliku Persistence Unit.

c) W kolejnym oknie pozostaw wszystkie opcje domyślne. Zwróć uwagę na wybór biblioteki do obsługi trwałości (Persistence Library): TopLink i łańcuch połączenia JDBC (Database Connection), wskazujący bazę danych „wbudowaną" w środowisko NetBeans (Derby). Jako strategię tworzenia tabel w bazie danych (Table Generation Strategy) pozostaw Create, czyli tworzenie w momencie instalacji aplikacji jeśli nie istnieją. Kliknij przycisk Finish.

d) Obejrzyj zawartość wygenerowanego przez kreator pliku persistence.xml w trybie XML. Zwróć uwagę na elementy <provider> i <property> zawierające wartości odpowiadające opcjom wybranym w oknie kreatora. Sprawdź czy zarówno właściwość toplink.jdbc.user i toplink.jdbc.password mają wartość „app" i jeśli nie to popraw zawartość pliku.

3. Utworzenie za pomocą kreatora zbioru encji na podstawie istniejących tabel w bazie danych.

a) Kliknij prawym przyciskiem myszy na ikonie projektu w drzewie projektów i z menu kontekstowego wybierz New->File/Folder. Kliknij przycisk Next >.

b) Następnie wybierz kategorię Persistence i typ pliku Entity Classes from Database. Kliknij przycisk Next >.

c) Z listy zdefiniowanych w środowisku NetBeans połączeń z bazą danych wybierz połączenie z wbudowanym serwerem Derby

d) Jeśli pojawi się okienko z prośbą o podanie hasła wprowadź hasło „app", zaznacz pole wyboru Remember password during this session i kliknij przycisk OK.

e) Z listy tabel do wyboru, przy zaznaczonym polu wyboru Include related tables, zaznacz myszą tabelę ORDERS i kliknij przycisk Add >.

f) Zwróć uwagę, że dzięki opcji Include Related Tables automatycznie zostały wybrane wszystkie tabele tworzące sieć połączeń zawierającą wskazaną tabelę ORDERS. Kliknij przycisk Next >.

g) W kolejnym oknie kreatora jako nazwę pakietu wprowadź „encje". Pozostaw zaproponowane nazwy klas encji dla poszczególnych tabel i pozostałe opcje. Kliknij przycisk Finish.

h) Obejrzyj wynik działania kreatora. Rozwiń drzewo projektu i obejrzyj wygenerowane klasy encji. Obejrzyj zawartość pliku persistence.xml w trybie XML. Zwróć uwagę na elementy <class> dodane przez kreator, wskazujące wygenerowane klasy jako zarządzane klasy trwałe dla jednostki trwałości OrdersLibraryPU.

i) Zbuduj projekt, wybierając z menu kontekstowego węzła projektu opcję Build Project. Wynikiem powinien być plik JAR ze skompilowaną biblioteką.