wtorek, 30 grudnia 2008

JBoss 5.0 i DataSource

Witam
Integracja JBoss-a z Eclipsem już za nami jednak by spokojnie pisać aplikacje Java EE pozostało kilka rzeczy do zrobienia. Najpierw zdefiniujemy JBoss-owi DataSource, czyli naszą bazę danych. Ja zdecydowałem się na PostgreSQL, Bartek na MySQL.
Wchodzimy najpierw do folderu z JBoss-em (dalej nazywany jboss_home) następnie docs\examples\jca i kopiujemy stąd przykładowy plik konfguracyjny naszej bazy. W moim przypadku postgres-ds.xml, dla tych co wybrali MySQL mysql-ds.xml. Plik ten wklejamy do jboss_home\server\default\deploy\. Zajrzyjmy do środka. Dla postgresa powinien wyglądać mniej więcej tak:
<datasources>
  <local-tx-datasource>
    <jndi-name>PostgresDS</jndi-name>
    <connection-url>jdbc:postgresql://[servername]:[port]/[databasename]</connection-url>
    <driver-class>org.postgresql.Driver</driver-class>
    <user-name>x</user-name>
    <password>y</password>
    <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
    <metadata>
      <type-mapping>PostgreSQL 7.2</type-mapping>
    </metadata>
  </local-tx-datasource>
</datasources>
Po kolei co jest co :
  • jndi-name jest to nazwa pod jaką zostanie zarejestrowana w JBoss-ie nasza baza.

  • connection-url jest to powiedzmy link do naszej bazy. Zamiast [servername] wpisujemy 127.0.0.1 ew localhost (lub adres serwera, na którym mamy serwer bazy), zamiast [port] wpisujemy port, na którym nasłuchuje nasza baza (dla postrgresa defaultowo 5432), [database] nazwa naszej bazy danych. U mnie wygląda to tak: jdbc:postgresql://127.0.0.1:5432/pz2 .

  • driver class mówi JBoss-owi jakiego rodzaju sterowników (o tym za chwile) ma szukać.

  • user-name i password już tłumaczyć chyba nie trzeba.

Sterowniki. Dla PostgreSQL dostępne pod http://jdbc.postgresql.org/download.html. Dla Javy 1.6 wybieramy wersje sterownika JDBC4, a dla pozostałych (obecnie serwery aplikacji obsługują do 1.5 więc wersja dla nas) JDBC3.
Dla MySQL http://dev.mysql.com/downloads/connector/j/5.1.html wybieramy *.tar.gz lub *.zip. Pobrane pliki *.jar (w wypadku MySQL należy wypakować i z głównego folderu skopiować connector) wrzucamy do jboss_home\server\default\lib\

Uff po tym wszystkim tworzymy projekt EAR tak jak zwykliśmy to robić, z warstwą biznesową i webową. Zostały nam do wykonania jeszcze dwie rzeczy.
W EarContent\META-INF\ tworzymy plik jboss-api.xml i wpisujemy:

<jboss-app>
  <loader-repository>
    MojProjekt:archive=ProjektEAR.ear
  </loader-repository>
</jboss-app>

Gdzie: MojProjekt jest to napis który w pewien sposób identyfikuje nasz projekt w JBossie (tych, którzy chcą się dowiedzieć więcej odsyłam do dokumentacji JBoss-a, a ProjektEAR.ear jest to nazwa dla zbudowanego projektu ProjektEAR przez eclipse-a (np. projekt EAR o nazwie asd po zbudowaniu da plik asd.ear).
Potem w części EJB musimy wyedytować plik persistence.xml (standardowo w ejbModule\META-INF\ ) u mnie wygląda tak.

<?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="ProjektEJB">
  <provider>org.hibernate.ejb.HibernatePersistence</provider>
  <jta-data-source>java:/PostgresDS</jta-data-source>
  <properties>
    <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
    <property name="hibernate.hbm2ddl.auto" value="update"/>
  </properties>
</persistence-unit>
</persistence>
Z tego wszystkiego interesuje nas:

  • name="ProjektEJB" nazwa części biznesowej projektu (akurat moja to ProjektEJB)

  • jta-data-source nazwa jndi naszej bazy danych skąd to wziąść? Nazwę podaliśmy w pliku postgres-ds.xml lub mysql-ds.xml (w pliku może być zdefiniowana więcej niż jedna baza!).
    Przedrostek java:/ jest związany z jndi, które mnie odrzucało od poprzednich wersji JBossa więc pominę co to, a powiem, że musi tu być i kropka.

  • hibernate.dialect mówi Hibernate-owi jakim "dialektem" SQL-a ma się posługiwać w komunikacji z bazą danych. Dla PostgreSQL jest to org.hibernate.dialect.PostgreSQLDialect dla MySQL5.0 org.hibernate.dialect.MySQL5Dialect (pełna lista tu).

  • hibernate.hbm2ddl.auto w jaki sposób hibernate "zachowuje się" w naszej bazie. Przy ustawieniu create-drop w momencie rozruchu tworzy tabele, ale gdy SessionFactory kończy swój żywot (czyli jak wyłączymy naszą aplikacje) sprząta po sobie w bazie. Jeśli chcemy zachować swoje dane musimy ustawić create lub update. Idąc za materiałem znalezionym w internecie użyłem update.

Reszta pozostaje bez zmian (pełną liste properties można znaleźć na tej stronie). W tym momencie możemy już pisać encje, beany mając dostęp do wstrzyknięć zależności i wszystkiego co Java EE nam zapewnia.
A tutaj macie prosty projekt działający pod JBossem i bazą PosrtgreSQL. Jako, że to projekt z Eclipse może być konieczne ponowne ustawienie zależności. Czyli:



A następnie:



W razie problemów pisać w komentarzach co się dzieje.
Życzę milej zabawy.

Drzazga:
W celu przeglądania wyników naszej pracy na bazie danych możemy posłużyć się phpMyAdmin albo zestawem programów prosto od Suna MySql Tools. Konfiguracja i przeglądanie zawartości bazy jest dosyć proste, więc nie będę się rozpisywał.
Jeśli wybraliście Postgresa to wraz z nim instaluje się pgAdmin III, w którym będziecie zarządzać bazą. HF

3 komentarze:

  1. To dziala! az sie boje:P
    Dobra robota, oby tak dalej;)

    OdpowiedzUsuń
  2. moglibyscie zuplodowac swoj dzialajacy projekt jeszcze raz?
    wiem ze to bylo ponad 4 lata temu, ale wasz artykul jest niezwykle przydatny :)

    OdpowiedzUsuń
    Odpowiedzi
    1. Milo to słyszeć :)
      Proponowałbym jednak rozejrzeć się trochę po świeższej blogosferze.
      Od tamtej pory sporo się uprościło i na przykład nie trzeba mieć 3 projektów by stworzyć prostą aplikacje z dostępem do warstw danych i webowej. Wystarczy sam WAR.
      A taki prosty projekt już można stworzyć za pomocą archetypów mavena (np. webapp-javaee6 ).

      Usuń