-
Wstęp
Aby Hibernate mógł poprawnie działać, musimy określić mapowanie pomiędzy naszym modelem obiektowym (klasami, które stworzyliśmy), a bazą danych (ORM - object/relational mapping). Informacje dotyczące tych mappingów znajdują sie w plikach XML (*.hbm.xml). Tworzenie i edycja XML są dość wygodne, o ile dysponuje się oczywiście jakimś dobrym narzędziem. Jednak wciąż musimy zamieszczać w różnych plikach dwukrotnie te same informacje. Jest to czasem dość kłopotliwe i dlatego dobrze byłoby się pozbyć tego typu niedogodności i zautomatyzować proces tworzenia plików *.hbm.xml.
-
Jak to działa ?
Istnieje do tego kilka narzędzi. Jedno z nich nazywa się XDoclet. XDoclet na podstawie odpowiednich komentarzy Javadoc zamieszczonych w klasach generuje nam określone pliki XML. XDoclet stosuje się do tworzenia deskryptorów EJB, a także w wielu innych miejscach. W naszym przypadku zastosowanie tego narzędzie spowoduje wygenerowanie plików *.hbm.xml.
W naszych przykładach korzystaliśmy z najnowszej wersji XDoclet 1.2.3, którą można ściągnąć
tutaj.
-
Co po kolei ?
Aby projekt Hibernate wykorzystujący narzędzie XDoclet mógł działać, należy załączyć następujące bliblioteki (najlepiej jest wewnątrz katalogu lib stworzyć katalog xdoclet), X.X.X oznacza wersje XDoclet:
- xdoclet-/X.X.X/.jar
- xdoclet-hibernate-module-/X.X.X/.jar
- xdoclet-xjavadoc-/X.X.X/.jar
- xdoclet-xdoclet-module-/X.X.X/.jar
- log4j-/X.X.X/.jar
- commons-collections-2.0.jar
- commons-logging.jar
Wewnątrz pliku build.xml należy zdefiniować nowego taska: hibernatedoclet, patrz
, a następnie stworzyć nowego targeta (najlepiej o nazwie generate), zależącego (depend) od targeta compile, który będzie korzystał z tego taska.
Co oznaczają kolejne atrybuty taska hibernatedoclet ?
- destdir - katalog, w którym maja zostać utworzone pliki z mappingami
- excludedtags - które komentarze javadoc należy ignorować
- force - czy zawsze tworzyć mappingi (true), czy tylko wtedy, gdy klasy są modyfikowane (false)
- verbose - czy informować o przebiegu procesu tworzenia mappingów
Ponadto znacznik hibernate informuje nas o wersji hibernate, dla której generujemy te mappingi.
Aby mappingi mogły być wygenerowane musimy jeszcze dodać odpowiednie komentarze do plików *.java zawierających klasy, odpowiadające tabelom (komentarze umieszczamy nad metodami get(), odpowiadającymi danym polom):
- @hibernate.class table="contact" - dana klasa ma być zmapowana na podaną tabelę
- @hibernate.id generator-class="native" - dane pole jest kluczem w tabeli (i jest generowane automatycznie)
- @hibernate.property - dane atrybut jest zwykłym polem w tabeli
- @hibernate.many-to-one class="Person" foreign-key="id" cascade="all" - dana klasa (tabela) jest w związku 'wiele do jednego' z klasą Person i odwołuje się do klasy Person poprzez jej klucz o nazwie id
- @hibernate.set role="contacts" cascade="all" inverse="true"
@hibernate.collection-key column="person"
@hibernate.collection-one-to-many class="Contact"
- dane klasa (talbela) jest w związku jeden do wielu z klasą Contact
Ponadto każdy komantarz javadoc (czyli np. @hibernate.id) może mieć jeszcze następujące 'atrybuty':
- column - nazwa kolumny (np. dla danego property)
- length - maksymalna długość (używane dla Stringa)
- not-null - czy pole może być nullem
- unique
- update
Strona z opisem znaczenia wszystkich komentarzy XDoclet znajduje się
tutaj.
Teraz możemy już uruchomić podany przykład:
$ ant generate - najpierw generujemy mappingi
$ ant run - potem uruchamiamy program