sobota, 22 listopada 2008

Połączenie Hiberante z Oraclem

1. Opis konfiguracji
Wszystkie ustawienia jakie będą opisane poniżej należy dokonać w pliku właściwości Javy o nazwie hibernate.properties lub w pliku XML o nazwie hibernate.cfg.xml co zostanie dokładniej opisane w kolejnym punkcie. Pliki te różnią się formą zapisu jednak opisy danych, które mają znaleźć się w obu plikach są takie same. Większość źródeł wiedzy o Hibernate jak i sama dokumentacja zalecają konfigurację Hibernate przy pomocy meta danych.
Plik konfiguracyjny składają się z listy pól właściwości. Większość właściwości przyjmuje odpowiednie wartości i nie ma potrzeby ich konfigurować. Jednak niektóre własności musimy koniecznie skonfigurować należą do nich:
  • hibernate.connection.driver_class – czyli klasa sterownika JDBC. Aby skorzystać z Framework Hibernate należy dołączyć do projektu bibliotekę (JAR) sterownika JDBC, który należy dopasować do konkretnej relacyjnej bazy danych. Sterownik ten należy pobrać ze strony bazy danych, z którą chcemy połączyć Hibernate.
  • hibernate.dialect - dialekt SQL wykorzystywany przez Hibernate. Ponieważ każda baza danych zachowuje się inaczej utworzono specjalne dialekty Hibernate, które usuwają te różnice. W projekcie należy określić z jakiego dialektu korzystamy w pliku konfiguracyjnym Hiberante. Dialekt definiuje odmianę języka SQL i cechy szczególne bazy danych.
  • hibernate.connection.url – podany przez JDBC adres URL do egzemplarza baz danych.
  • hibernate.connection.username – nazwa użytkownika bazy danych.
  • hibernate.connection.password – hasło do bazy danych.
2. Przykład konfiguracji Hiberante za pomocą meta danych zapisywany jest w projekcie jako plik hibernate.cfg.xml. Prezentowana aplikacja łączy się z bazą Oracle 10g.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "
-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.OracleDialect
</property>
<property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver
</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl
</property>
<property name="hibernate.connection.username">uzytkownik
</property>
<property name="hibernate.connection.password">haslo
</property>
<mapping resource="paczka/nazwaKlasy.hbm.xml" />
</session-factory>
</hibernate-configuration>

Przy pomocy znacznika <property> można określić właściwości połączenia z bazą danych. Znacznik &l;tmapping&p; służy do konfiguracji odwzorowań.

Źródła: Hiberante od Nowicjusza do Profesjonalisty, Dave Minter, Jeff Linwood

piątek, 21 listopada 2008

Hibernate + NetBeans 6.5 krok po kroku

Przykład stworzony jest przy pomocy NetBeans 6.5 oraz technologii Hibernate 3.5. Baza danych to Oracle 10g.

1. Tworzymy nowy projekt Ctrl+Shift+N z kategorii Java - > Java Aplication następnie Next. Wpisujemy nazwę projektu Przykład1 oraz wybieramy ścieżkę docelową, gdzie zostanie utworzony projekt. A następnie przycisk Finish.

2. Jeśli jeszcze nie mamy wcześniej zainstalowanego Hibernate można to zrobić przy pomocy Tools -> Plugins a następnie wybrać Hibernate Support oraz Hibernate 3.2.5 Library i Install.

3. Skoro już mamy zainstalowane biblioteki Hibernate powinniśmy je jeszcze dołączyć do naszego projektu. W panelu Projects zaznaczamyLibraries, potem kolejno Add Library.

4. Tworzymy plik konfiguracyjny Hibernate , który powinien się nazywać hibernate.cfg.xml. Wybieramy New -> XML Document i nadajemy mu nazwę hibernate.cfg i Next, Finish.

I uzupełniamy odpowiednim kodem, przykład pliku konfiguracyjnego:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.OracleDialect
</property>
<property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver
</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl
</property>
<property name="hibernate.connection.username">uzytkownik
</property>
<property name="hibernate.connection.password">haslo
</property>
</session-factory>
</hibernate-configuration>


Więcej o konfiguracji połączenia w artykule Połączenie Hibernate z Oraclem.

5. Kolejną ważną rzeczą jest dodanie sterownika do odpowiedniej bazy danych z którą chcemy połączyć aplikację tzn JDBC Driver.

Można je pobrać dla Oracle ze strony: http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html

Dodajemy to następująco Libraries ->Properties -> Add JAR/Folder wybieramy odpowiednie archiwum JAR Open i Ok.

6. A teraz coś czego nie można było tworzyć we wcześniejszej wersji Hibernate, czyli generowanie kodu na podstawie istniejących tabel w bazie danych.

Aby móc skorzystać z tej opcji musimy najpierw w połączonej z Hibernate bazie danych stworzyć tabele. Dla zademonstrowanie tego przykładu utworzyłam taką tabelę w Oraclu:

CREATE TABLE Osoba

( imie VARCHAR2(15) NOT NULL,

nazwisko VARCHAR2(15) NOT NULL,

plec VARCHAR2(1) CHECK(plec IN ('M','D')),

pesel VARCHAR2(11) PRIMARY KEY

);

Używamy Crlt+N wybieramy Categories: Hibernate i File Types: Hibernate Mapping Files and POJOs from Database.

Next.

Nadajemy nazwę pliku generateCode i dajemy Next. Pojawia się okno z nazwą bazy, należy podać hasło i OK. W oknie Available Tables pojawią się wszystkie tabele, które są utworzone w bazie danych, można dodać tylko część z nich do projektu przyciskiem Add. Bądź dodać całą bazę używając przycisku Add All. Next.

Domyśle ustawienia sprawiają, że zostaną utworzone klasy Javy oraz pliki mapujące Hibernate , tak więc nic nie należy zmieniać, pozostaje przycisk Finish.

Powstała dzięki temu klasa Osoba.java oraz plik mapujący Osoba.hbm.xml oraz plik xml generateCode.xml.

Aby udowodnić, że to naprawdę super narzędzie skopuję wygenerowane pliki

Osoba.java

package przykad1;

public class Osoba implements java.io.Serializable {

private String pesel;

private String imie;

private String nazwisko;

private String plec;

public Osoba() {

}

public Osoba(String pesel, String imie, String nazwisko) {

this.pesel = pesel;

this.imie = imie;

this.nazwisko = nazwisko;

}

public Osoba(String pesel, String imie, String nazwisko, String plec) {

this.pesel = pesel;

this.imie = imie;

this.nazwisko = nazwisko;

this.plec = plec;

}

public String getPesel() {

return this.pesel;

}

public void setPesel(String pesel) {

this.pesel = pesel;

}

public String getImie() {

return this.imie;

}

public void setImie(String imie) {

this.imie = imie;

}

public String getNazwisko() {

return this.nazwisko;

}

public void setNazwisko(String nazwisko) {

this.nazwisko = nazwisko;

}

public String getPlec() {

return this.plec;

}

public void setPlec(String plec) {

this.plec = plec;

}

}

Zostały więc wygenerowane od razu gettery i settery oraz konstruktory klasy.

Plik mapujący wygląda następująco:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2008-11-22 01:24:59 by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
<class name="przykad1.Osoba" table="OSOBA" schema="AGATA">
<id name="pesel" type="string">
<column name="PESEL" length="11" />
<generator class="assigned" />
</id>
<property name="imie" type="string">
<column name="IMIE" length="15" not-null="true" />
</property>
<property name="nazwisko" type="string">
<column name="NAZWISKO" length="15" not-null="true" />
</property>
<property name="plec" type="string">
<column name="PLEC" length="1" />
</property>
</class>
</hibernate-mapping>
Warto również zajrzeć jak zmienił się plik hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.OracleDialect
</property>
<property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver
</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl
</property>
<property name="hibernate.connection.username">uzytkownik
</property>
<property name="hibernate.connection.password">haslo
</property>
<mapping resource="przykad1/Osoba.hbm.xml"/>
</session-factory>
</hibernate-configuration>

Automatycznie został dodany znacznik ze ścieżką do pliku mapującego.