Grupa MagazynyInternetowe
Online: 893Informują one o tym, że klasa User ma zostać zmapowana do tabeli USERS. Odpowiednie adnotacje należy także dodać przy poszczególnych polach klasy. Pole id jest kluczem głównym:
1. @Id @GeneratedValue 2. @Column(name = "USER_ID") 3. private Long id;
@Id oznacza, że pole jest kluczem głównym,
@GeneratedValue informuje że poszczególne
wartości pola mają być automatycznie generowane,
a @Column definiuje nazwę kolumny
w tabeli (USERS), z którą dane pole ma być
powiązane.
W przypadku pozostały pól określamy juz tylko nazwy kolumn w tabeli:
1. @Column(name = "NAME")private String name; 2. @Column(name = "SURNAME")private String surname; 3. @Column(name = "EMAIL")private String email; 4. @Column(name = "PASSWORD")private String password;Klasa News
Klasa News jest bardzo podobna do klasy User. Również zawiera dwa konstruktory, pola prywatne określające zawartość newsa, a także gettery i settery pozwalające na zarządzanie tymi polami. package news;
Listing zwinięty - 38 linii
Same adnotacje też niewiele się różnią od tych z klasy User:
1. @Entity 2. @Table(name = "NEWS") 3. public class News { 4. @Id @GeneratedValue 5. @Column(name = "NEWS_ID") 6. private Long id; 7. @Column(name = "TITLE") 8. private String title; 9. @Column(name = "CONTENT") 10. private String content; 11. //... 12. }
jednak w przypadku pola author są całkowicie inne:
1. @ManyToOne(cascade = CascadeType.ALL) 2. @JoinColumn(name = "USER_ID") 3. private User author;
Ustanawiają one połączenie klasy News z klasą
User poprzez pole author. Określają także sposób
usuwania rekordów na kaskadowy, czyli w przypadku
usunięcia użytkownika, automatycznie
usunięte zostaną wszystkie napisane przez niego
newsy. Nazwa kolumny łączącej klasę News z klasą
User ustalana jest za pomocą adnotacji @JoinColumn.
I tak większość pracy już masz za sobą!
Dla wygody pracy z Hibernate zbudujemy jeszcze klasę pomocniczą - HibernateUtil. Oto kod, który zaraz przeanalizujemy:
1. package presistence; 2. import org.hibernate.*; 3. import org.hibernate.cfg.*; 4. public class HibernateUtil { 5. private static SessionFactory sessionFactory; 6. static { 7. try { 8. sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); 9. } catch(Throwable ex) { 10. throw new ExceptionInInitializerError(ex); 11. } 12. } 13. public static SessionFactory getSessionFactory() { 14. return sessionFactory; 15. } 16. public static void shutdown() { 17. getSessionFactory().close(); 18. } 19. }
Klasa ta tworzy w bloku statycznym statyczną
zmienną sessionFactory, która jest zwracana przez
statyczną metodę getSesionFactory. Zmienna ta
wskazuje na fabrykę sesji, która w typowym przypadku
aplikacji korzystającej z Hibernate powinna
być tylko jedna na całą aplikację - stąd jest ona
statyczna i tworzona przy pierwszym odwołaniu do
klasy HibernateUtil.
Sesje w Hibernate określają niejako połączenie z bazą. Ta sesja posiada API używane do nadawania trwałości obiektom. Także za pośrednictwem sesji tworzone są transakcje.
Klasa HibernateUtil w przypadku naszej prostej aplikacji jest poniekąd zbędna - wszystko, co się tu znajduje, można było zawrzeć w klasie Run. Jeśli jednak aplikacja byłaby bardziej złożona, a jednocześnie chciałbyś pracować z obiektami wykonywanymi w wielu klasach, klasa HibernateUtil okaże się bardzo pomocna.
Dzięki niej
możesz zaoszczędzić sobie pisania ciągle tego samego
kodu oraz zapewnić istnienie tylko jednego
obiektu klasy SessionFactory na aplikację.
W naszym przykładzie tylko jedna klasa korzysta
z klas News oraz User. Jest to klasa Run:
Listing zwinięty - 40 linii
Komentarzy: 1
Niestety nie mogę znaleźć liku do paczki z całością programu - przydałaby się do testów
Artykuły tego autora:
Baz danych to podstawa nowoczesnych witryn. Zrozumienie zasady ich działania daje nowe spojrzenie na sieć. A w dodatku jest proste.
Polecamy:
Na skróty:
Magazyny Internetowe| Co za ile| Programy| Praca| Magazyn Internet| Internet Maker| Web Toster| ForumNasze serwisy: