Tworzenie samodzielnej aplikacji z Hibernate w NetBeans IDE 6.9
Z Jacek Laskowski - Wiki Projektanta Java EE
Artykuł przedstawia kroki niezbędne do stworzenia samodzielnej aplikacji korzystającej z Hibernate w zintegrowanym środowisku programistycznym NetBeans IDE 6.9.
Wymagane oprogramowanie:
Kompletny projekt jest dostępny jako HibernateApplication.zip.
Stworzenie projektu HibernateApplication
Rozpoczynamy od stworzenia samodzielnej aplikacji HibernateApplication. Wciskamy kombinację klawiszy Cmd+Shift+n (File > New Project) i wybieramy Java Application w kategorii Java.
Wciskamy przycisk Next.
Podajemy dane aplikacji i wciskamy Finish.
Po chwili, w widoku Projects po lewej, pojawi się struktura projektu HibernateApplication oraz po prawej edytor z klasą główna Main.
Zdefiniowanie biblioteki Hibernate-3.5.3
NetBeans IDE 6.9 przychodzi z bibliotekami Hibernate oraz Hibernate JPA. Są one jednak w starszych wersjach i wymagają pobrania dodatkowych bibliotek wspierających.
Zaleca się, aby zdefiniować własną bibliotekę, która będzie zawierała wszystkie potrzebne pliki do poprawnej pracy Hibernate.
Wybieramy menu Tools > Libraries
a następnie wciskamy przycisk New Library...
W okienku dialogowym nadajemy nazwę naszej nowej bibliotece - Hibernate-3.5.3.
i wciskamy przycisk OK.
Upewniwszy się, że mamy zaznaczone Hibernate-3.5.3 w panelu Libraries po lewej, dodajemy wymagane pliki przyciskiem Add JAR/Folder. Dodajemy hibernate3.jar z katalogu domowego Hibernate oraz wszystkie pliki jar z katalogu lib/required Hibernate'a poza slf4j-api-1.5.8.jar (powinno ich być 5). Poza tym, dodajemy dwa pliki slf4j-api-1.6.0.jar i slf4j-simple-1.6.0.jar z katalogu domowego slf4j. Całość powinna przedstawiać się jak na poniższym obrazku.
Kończymy przyciskiem OK.
Dodanie własnej biblioteki Hibernate-3.5.3
W widoku Projects z menu kontekstowego gałęzi Libraries wybieramy Add Library.
Wybieramy bibliotekę Hibernate-3.5.3.
Wciskamy przycisk Add Library.
Stworzenie klasy pomocniczej HibernateUtil
Praca z Hibernate sprowadza się do wczytania jego konfiguracji za pomoca obiektu org.hibernate.cfg.Configuration i jego metody public Configuration configure(), a następnie "zmaterializowania" fabryki sesji - logicznych połączeń do bazy danych.
Skorzystamy z dobrodziejstw NetBeans IDE 6.9, gdzie owe konstrukcje ukryte są w postaci klasy HibernateUtil.
Cmd+n (File > New File...) i wybieramy HibernateUtil.java w kategorii Hibernate.
Wciskamy przycisk Next >.
Określamy charakterystykę naszej klasy pomocniczej:
- Class Name: HibernateUtil
- Package: utils
Wciskamy przycisk Finish.
Powstanie klasa utils.HibernateUtil, której jedynym zadaniem będzie zainicjowanie Hibernate.
Uruchomienie Hibernate przez utils.HibernateUtil
Mając do dyspozycji utils.HibernateUtil jesteśmy gotowi do programowania korzystając z funkcjonalności oferowanej przez Hibernate. Na początek wystarczy zainicjowanie Hibernate na bazie konfiguracji zapisanej w hibernate.cfg.xml, który jest jego domyślnym plikiem konfiguracyjnym.
package hibernateapplication; import utils.HibernateUtil; /** * @author Jacek Laskowski */ public class Main { public static void main(String[] args) { HibernateUtil.getSessionFactory(); } }
Sprawdzamy poprawność aplikacji uruchamiając ją klawiszem F6.
run:
2 [main] INFO org.hibernate.cfg.annotations.Version - Hibernate Annotations 3.5.3-Final
30 [main] INFO org.hibernate.cfg.Environment - Hibernate 3.5.3-Final
42 [main] INFO org.hibernate.cfg.Environment - hibernate.properties not found
45 [main] INFO org.hibernate.cfg.Environment - Bytecode provider name : javassist
49 [main] INFO org.hibernate.cfg.Environment - using JDK 1.4 java.sql.Timestamp handling
181 [main] INFO org.hibernate.annotations.common.Version - Hibernate Commons Annotations 3.2.0.Final
187 [main] INFO org.hibernate.cfg.Configuration - configuring from resource: /hibernate.cfg.xml
187 [main] INFO org.hibernate.cfg.Configuration - Configuration resource: /hibernate.cfg.xml
Initial SessionFactory creation failed.org.hibernate.HibernateException: /hibernate.cfg.xml not found
Exception in thread "main" java.lang.ExceptionInInitializerError
at utils.HibernateUtil.<clinit>(HibernateUtil.java:28)
at hibernateapplication.Main.main(Main.java:11)
Caused by: org.hibernate.HibernateException: /hibernate.cfg.xml not found
at org.hibernate.util.ConfigHelper.getResourceAsStream(ConfigHelper.java:170)
at org.hibernate.cfg.Configuration.getConfigurationInputStream(Configuration.java:1497)
at org.hibernate.cfg.Configuration.configure(Configuration.java:1519)
at org.hibernate.cfg.AnnotationConfiguration.configure(AnnotationConfiguration.java:1194)
at org.hibernate.cfg.AnnotationConfiguration.configure(AnnotationConfiguration.java:107)
at org.hibernate.cfg.Configuration.configure(Configuration.java:1506)
at org.hibernate.cfg.AnnotationConfiguration.configure(AnnotationConfiguration.java:1188)
at utils.HibernateUtil.<clinit>(HibernateUtil.java:24)
... 1 more
Java Result: 1
BUILD SUCCESSFUL (total time: 1 second)Uruchomienie aplikacji zakończy się błędem niedostępności pliku konfiguracyjnego Hibernate - Caused by: org.hibernate.HibernateException: /hibernate.cfg.xml not found. Oczekiwane. W kolejnym kroku naprawimy to.
Utworzenie pliku konfiguracyjnego Hibernate - hibernate.cfg.xml
Z menu kontekstowego projektu, wybierając menu New > Other... lub wciskając kombinację klawiszy Cmd+n wybieramy menu Hibernate > Hibernate Configuration Wizard.
Wciskamy przycisk Next >.
W oknie dialogowym New Hibernate Configuration Wizard definiujemy:
- File Name: hibernate.cfg (rozszerzenie .xml jest dodawane automatycznie)
oraz upewniamy się, że Folder wskazuje na katalog src.
Wciskamy przycisk Next i wybieramy połączenie do bazy danych. W domyślnej konfiguracji NetBeans oferuje dostęp do bazy danych Java DB (Apache Derby), która spełnia nasze oczekiwania wystarczająco.
Zatwierdzamy wybór przyciskiem Finish.
Struktura projektu powinna przedstawiać się jak poniżej.
Plik hibernate.cfg.xml przedstawia się następująco:
<?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.DerbyDialect</property> <property name="hibernate.connection.driver_class">org.apache.derby.jdbc.ClientDriver</property> <property name="hibernate.connection.url">jdbc:derby://localhost:1527/sample</property> <property name="hibernate.connection.username">app</property> <property name="hibernate.connection.password">app</property> </session-factory> </hibernate-configuration>
Modyfikujemy go o dodatkową konfigurację Hibernate, która określa, że schemat bazodanowy będzie aktualizowany każdorazowo podczas uruchomienia aplikacji - hbm2ddl.auto z wartością update oraz wypisane zostaną wykonywane polecenia SQL (atrybut show_sql).
<?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.DerbyDialect</property> <property name="hibernate.connection.driver_class">org.apache.derby.jdbc.ClientDriver</property> <property name="hibernate.connection.url">jdbc:derby://localhost:1527/sample</property> <property name="hibernate.connection.username">app</property> <property name="hibernate.connection.password">app</property> <property name="current_session_context_class">thread</property> <property name="show_sql">true</property> <property name="hbm2ddl.auto">update</property> </session-factory> </hibernate-configuration>
Uruchamiamy aplikację wciskając klawisz F6.
run:
2 [main] INFO org.hibernate.cfg.annotations.Version - Hibernate Annotations 3.5.3-Final
39 [main] INFO org.hibernate.cfg.Environment - Hibernate 3.5.3-Final
44 [main] INFO org.hibernate.cfg.Environment - hibernate.properties not found
54 [main] INFO org.hibernate.cfg.Environment - Bytecode provider name : javassist
65 [main] INFO org.hibernate.cfg.Environment - using JDK 1.4 java.sql.Timestamp handling
186 [main] INFO org.hibernate.annotations.common.Version - Hibernate Commons Annotations 3.2.0.Final
192 [main] INFO org.hibernate.cfg.Configuration - configuring from resource: /hibernate.cfg.xml
192 [main] INFO org.hibernate.cfg.Configuration - Configuration resource: /hibernate.cfg.xml
358 [main] INFO org.hibernate.cfg.Configuration - Configured SessionFactory: null
367 [main] INFO org.hibernate.cfg.search.HibernateSearchEventListenerRegister - Unable to find
org.hibernate.search.event.FullTextIndexEventListener on the classpath. Hibernate Search is not enabled.
403 [main] INFO org.hibernate.cfg.AnnotationConfiguration - Hibernate Validator not found: ignoring
420 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - Using Hibernate built-in connection pool (not for production use!)
420 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - Hibernate connection pool size: 20
420 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - autocommit mode: false
433 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - using driver: org.apache.derby.jdbc.ClientDriver at URL: jdbc:derby://localhost:1527/sample
433 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - connection properties: {user=app, password=****}
1273 [main] INFO org.hibernate.cfg.SettingsFactory - RDBMS: Apache Derby, version: 10.5.3.0 - (802917)
1274 [main] INFO org.hibernate.cfg.SettingsFactory - JDBC driver: Apache Derby Network Client JDBC Driver, version: 10.5.3.0 - (802917)
1369 [main] INFO org.hibernate.dialect.Dialect - Using dialect: org.hibernate.dialect.DerbyDialect
1528 [main] INFO org.hibernate.transaction.TransactionFactoryFactory - Using default transaction strategy (direct JDBC transactions)
1529 [main] INFO org.hibernate.transaction.TransactionManagerLookupFactory - No TransactionManagerLookup configured (in JTA environment,
use of read-write or transactional second-level cache is not recommended)
1529 [main] INFO org.hibernate.cfg.SettingsFactory - Automatic flush during beforeCompletion(): disabled
1529 [main] INFO org.hibernate.cfg.SettingsFactory - Automatic session close at end of transaction: disabled
1530 [main] INFO org.hibernate.cfg.SettingsFactory - Scrollable result sets: enabled
1530 [main] INFO org.hibernate.cfg.SettingsFactory - JDBC3 getGeneratedKeys(): disabled
1530 [main] INFO org.hibernate.cfg.SettingsFactory - Connection release mode: auto
1530 [main] INFO org.hibernate.cfg.SettingsFactory - Default batch fetch size: 1
1530 [main] INFO org.hibernate.cfg.SettingsFactory - Generate SQL with comments: disabled
1530 [main] INFO org.hibernate.cfg.SettingsFactory - Order SQL updates by primary key: disabled
1530 [main] INFO org.hibernate.cfg.SettingsFactory - Order SQL inserts for batching: disabled
1530 [main] INFO org.hibernate.cfg.SettingsFactory - Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
1532 [main] INFO org.hibernate.hql.ast.ASTQueryTranslatorFactory - Using ASTQueryTranslatorFactory
1532 [main] INFO org.hibernate.cfg.SettingsFactory - Query language substitutions: {}
1532 [main] INFO org.hibernate.cfg.SettingsFactory - JPA-QL strict compliance: disabled
1532 [main] INFO org.hibernate.cfg.SettingsFactory - Second-level cache: enabled
1532 [main] INFO org.hibernate.cfg.SettingsFactory - Query cache: disabled
1532 [main] INFO org.hibernate.cfg.SettingsFactory - Cache region factory : org.hibernate.cache.impl.NoCachingRegionFactory
1532 [main] INFO org.hibernate.cfg.SettingsFactory - Optimize cache for minimal puts: disabled
1532 [main] INFO org.hibernate.cfg.SettingsFactory - Structured second-level cache entries: disabled
1535 [main] INFO org.hibernate.cfg.SettingsFactory - Echoing all SQL to stdout
1536 [main] INFO org.hibernate.cfg.SettingsFactory - Statistics: disabled
1536 [main] INFO org.hibernate.cfg.SettingsFactory - Deleted entity synthetic identifier rollback: disabled
1536 [main] INFO org.hibernate.cfg.SettingsFactory - Default entity-mode: pojo
1536 [main] INFO org.hibernate.cfg.SettingsFactory - Named query checking : enabled
1536 [main] INFO org.hibernate.cfg.SettingsFactory - Check Nullability in Core (should be disabled when Bean Validation is on): enabled
1632 [main] INFO org.hibernate.impl.SessionFactoryImpl - building session factory
1639 [main] INFO org.hibernate.impl.SessionFactoryObjectFactory - Not binding factory to JNDI, no JNDI name configured
1643 [main] INFO org.hibernate.tool.hbm2ddl.SchemaUpdate - Running hbm2ddl schema update
1643 [main] INFO org.hibernate.tool.hbm2ddl.SchemaUpdate - fetching database metadata
1645 [main] INFO org.hibernate.tool.hbm2ddl.SchemaUpdate - updating schema
1648 [main] INFO org.hibernate.tool.hbm2ddl.SchemaUpdate - schema update complete
BUILD SUCCESSFUL (total time: 2 seconds)Tym razem aplikacja została uruchomiona poprawnie, co sprowadziło się do zainicjowania pustej sesji Hibernate i nawiązania połączenia z bazą danych bez użycia encji, która mogłaby być odwzorowana na właściwe tabele. Stwórzmy jedną.
Jeśli wystąpi poniższy błąd, oznacza to zatrzymaną bazę danych, którą uruchamiamy przechodząc do widoku Services (Cmd+5), w którym rozwijamy kategorię Databases > Java DB i uruchamiamy serwer bazodanowy, z menu kontekstowego wybierając Start Server.
4666 [main] WARN org.hibernate.cfg.SettingsFactory - Could not obtain connection to query metadata
java.sql.SQLNonTransientConnectionException: java.net.ConnectException : Error connecting to server localhost on port 1527 with message Connection refused.
at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unknown Source)
at org.apache.derby.client.am.SqlException.getSQLException(Unknown Source)
at org.apache.derby.jdbc.ClientDriver.connect(Unknown Source)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:154)
at org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:133)
at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:114)
at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2163)
at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2159)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1383)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
at utils.HibernateUtil.<clinit>(HibernateUtil.java:19)
at hibernateapplication.Main.main(Main.java:11)
Caused by: org.apache.derby.client.am.DisconnectException: java.net.ConnectException : Error connecting to server localhost on port 1527 with message Connection refused.
at org.apache.derby.client.net.NetAgent.<init>(Unknown Source)
at org.apache.derby.client.net.NetConnection.newAgent_(Unknown Source)
at org.apache.derby.client.am.Connection.<init>(Unknown Source)
at org.apache.derby.client.net.NetConnection.<init>(Unknown Source)
at org.apache.derby.client.net.NetConnection40.<init>(Unknown Source)
at org.apache.derby.client.net.ClientJDBCObjectFactoryImpl40.newNetConnection(Unknown Source)
... 11 more
Caused by: java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432)
at java.net.Socket.connect(Socket.java:529)
at java.net.Socket.connect(Socket.java:478)
at java.net.Socket.<init>(Socket.java:375)
at java.net.Socket.<init>(Socket.java:189)
at javax.net.DefaultSocketFactory.createSocket(SocketFactory.java:206)
at org.apache.derby.client.net.OpenSocketAction.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
... 17 moreOczywiście wybór bazy danych i jej konfiguracja w Hibernate determinuje potencjalne błędy, więc u Ciebie może być trochę inaczej, jeśli baza jest inna niż ta udostępniana przez NetBeans.
Stworzenie encji - Klient
Encja jest niczym innym jak klasą javową, która nie jest zobowiązana do implementacji interfejsu czy rozszerzania klasy pochodzącej z Hibernate. Ten rodzaj klasy nazywamy POJO (ang. Plain Old Java Object), co podkreśla "czystość techniczną" tak skonstruowanej klasy.
Encja składa się z dwóch elementów - klasy z atrybutami zwykle odpowiadającymi kolumnom w tabeli w bazie danych oraz jej definicji w pliku konfiguracyjnym Hibernate.
Zacznijmy od stworzenia klasy model.Klient. Cmd+n i wybieramy Java > Java Class.
Wciskamy Next, aby w kolejnym kroku zdefiniować klasę - jej nazwę i pakiet.
Wciskamy przycisk Finish.
Definiujemy atrybuty encji Klient - imie i nazwisko, oba typu String. Dodatkowo elementem obowiązkowym każdej encji jest określenie identyfikatora, który będzie odpowiadał kluczowi głównemu w tabeli, z którą encja jest związana (do której jest odwzorowywana).
package model; import java.io.Serializable; /** * @author Jacek Laskowski */ public class Klient implements Serializable { Long id; String imie; String nazwisko; public Klient() { } public Klient(String imie, String nazwisko) { this.imie = imie; this.nazwisko = nazwisko; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getImie() { return imie; } public void setImie(String imie) { this.imie = imie; } public String getNazwisko() { return nazwisko; } public void setNazwisko(String nazwisko) { this.nazwisko = nazwisko; } }
Podczas implementacji warto skorzystać z udogodnień NetBeans IDE takich jak Ctrl+i (Source > Insert Code) do automatycznego utworzenia metod zapisu (ang. setter) i odczytu (ang. getter).
Odwzorowanie encji na tabelę w pliku konfiguracyjnym Hibernate - hibernate.hbm.xml
Cmd+n i wybieramy Hibernate Mapping Wizard z kategorii Hibernate.
Wciskamy przycisk Next >.
W kolejnym kroku akceptujemy proponowane wartości.
Wciskamy przycisk Next >.
Wybieramy klasę model.Klient w polu Class to Map oraz (opcjonalnie) tabelę z listy rozwijalnej w polu Database Table (w naszym przypadku tabela będzie tworzona podczas uruchomienia aplikacji, więc pozostawimy to pole puste).
Wciskamy przycisk Finish.
W ten sposób powstanie plik hibernate.hbm.xml, który należy uzupełnić o właściwe odwzorowanie relacyjno-obiektowe. Ostatecznie plik będzie przedstawiał się jak następuje.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="model.Klient"> <id name="id"> <generator class="native" /> </id> <property name="imie" /> <property name="nazwisko" /> </class> </hibernate-mapping>
Podczas tworzenia wstępnej wersji pliku hibernate.hbm.xml NetBeans dodaje wskazanie na niego w pliku konfiguracyjnym Hibernate - hibernate.cfg.xml, który teraz przedstawia się następująco:
<?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.DerbyDialect</property> <property name="hibernate.connection.driver_class">org.apache.derby.jdbc.ClientDriver</property> <property name="hibernate.connection.url">jdbc:derby://localhost:1527/sample</property> <property name="hibernate.connection.username">app</property> <property name="hibernate.connection.password">app</property> <property name="current_session_context_class">thread</property> <property name="show_sql">true</property> <property name="hbm2ddl.auto">update</property> <mapping resource="hibernate.hbm.xml"/> </session-factory> </hibernate-configuration>
Z tak przygotowaną aplikacją możemy ją uruchomić. F6 i podczas uruchomienia można zauważyć, że encja Klient została rozpoznana przez Hibernate (na samym dole komunikatów z konsoli poniżej).
run: 2 [main] INFO org.hibernate.cfg.annotations.Version - Hibernate Annotations 3.5.3-Final 23 [main] INFO org.hibernate.cfg.Environment - Hibernate 3.5.3-Final 26 [main] INFO org.hibernate.cfg.Environment - hibernate.properties not found 29 [main] INFO org.hibernate.cfg.Environment - Bytecode provider name : javassist 34 [main] INFO org.hibernate.cfg.Environment - using JDK 1.4 java.sql.Timestamp handling 169 [main] INFO org.hibernate.annotations.common.Version - Hibernate Commons Annotations 3.2.0.Final 177 [main] INFO org.hibernate.cfg.Configuration - configuring from resource: /hibernate.cfg.xml 177 [main] INFO org.hibernate.cfg.Configuration - Configuration resource: /hibernate.cfg.xml 339 [main] INFO org.hibernate.cfg.Configuration - Reading mappings from resource : hibernate.hbm.xml 582 [main] INFO org.hibernate.cfg.Configuration - Configured SessionFactory: null 596 [main] INFO org.hibernate.cfg.search.HibernateSearchEventListenerRegister - Unable to find org.hibernate.search.event.FullTextIndexEventListener on the classpath. Hibernate Search is not enabled. 668 [main] INFO org.hibernate.cfg.HbmBinder - Mapping class: model.Klient -> Klient ... BUILD SUCCESSFUL (total time: 2 seconds)
Użycie encji Klient w aplikacji
Pozostaje skorzystać z encji Klient w naszej aplikacji, w klasie Main. Dodajemy do niej uruchomienie Hibernate i wykonanie kilku operacji na encji, które sprowadzą się do stworzenia rekordu w tabeli lub wypisana wszystkich na konsolę.
package hibernateapplication; import java.util.List; import model.Klient; import org.hibernate.Session; import utils.HibernateUtil; /** * @author Jacek Laskowski */ public class Main { public static void main(String[] args) { Main main = new Main(); if (args.length > 0 && "zapisz".equals(args[0])) { main.stworzKlienta(args[1], args[2]); } else { List<Klient> klienci = main.wypiszKlientow(); for (Klient klient : klienci) { System.out.println("Klient nr " + klient.getId() + ", imie: " + klient.getImie() + ", nazwisko= " + klient.getNazwisko()); } } HibernateUtil.getSessionFactory().close(); } private void stworzKlienta(String imie, String nazwisko) { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); Klient klient = new Klient(imie, nazwisko); session.save(klient); session.getTransaction().commit(); } private List<Klient> wypiszKlientow() { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); List result = session.createQuery("from Klient").list(); session.getTransaction().commit(); return result; } }
Wciskamy F6 i...
run:
7 [main] INFO org.hibernate.cfg.annotations.Version - Hibernate Annotations 3.5.3-Final
48 [main] INFO org.hibernate.cfg.Environment - Hibernate 3.5.3-Final
55 [main] INFO org.hibernate.cfg.Environment - hibernate.properties not found
60 [main] INFO org.hibernate.cfg.Environment - Bytecode provider name : javassist
78 [main] INFO org.hibernate.cfg.Environment - using JDK 1.4 java.sql.Timestamp handling
391 [main] INFO org.hibernate.annotations.common.Version - Hibernate Commons Annotations 3.2.0.Final
417 [main] INFO org.hibernate.cfg.Configuration - configuring from resource: /hibernate.cfg.xml
417 [main] INFO org.hibernate.cfg.Configuration - Configuration resource: /hibernate.cfg.xml
570 [main] INFO org.hibernate.cfg.Configuration - Reading mappings from resource : hibernate.hbm.xml
779 [main] INFO org.hibernate.cfg.Configuration - Configured SessionFactory: null
801 [main] INFO org.hibernate.cfg.search.HibernateSearchEventListenerRegister - Unable to find
org.hibernate.search.event.FullTextIndexEventListener on the classpath. Hibernate Search is not enabled.
898 [main] INFO org.hibernate.cfg.HbmBinder - Mapping class: model.Klient -> Klient
919 [main] INFO org.hibernate.cfg.AnnotationConfiguration - Hibernate Validator not found: ignoring
1044 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - Using Hibernate built-in connection pool (not for production use!)
1044 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - Hibernate connection pool size: 20
1044 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - autocommit mode: false
1059 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - using driver: org.apache.derby.jdbc.ClientDriver at URL: jdbc:derby://localhost:1527/sample
1061 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - connection properties: {user=app, password=****}
1616 [main] INFO org.hibernate.cfg.SettingsFactory - RDBMS: Apache Derby, version: 10.5.3.0 - (802917)
1617 [main] INFO org.hibernate.cfg.SettingsFactory - JDBC driver: Apache Derby Network Client JDBC Driver, version: 10.5.3.0 - (802917)
1648 [main] INFO org.hibernate.dialect.Dialect - Using dialect: org.hibernate.dialect.DerbyDialect
1718 [main] INFO org.hibernate.transaction.TransactionFactoryFactory - Using default transaction strategy (direct JDBC transactions)
1719 [main] INFO org.hibernate.transaction.TransactionManagerLookupFactory - No TransactionManagerLookup configured (in JTA environment,
use of read-write or transactional second-level cache is not recommended)
1719 [main] INFO org.hibernate.cfg.SettingsFactory - Automatic flush during beforeCompletion(): disabled
1719 [main] INFO org.hibernate.cfg.SettingsFactory - Automatic session close at end of transaction: disabled
1719 [main] INFO org.hibernate.cfg.SettingsFactory - Scrollable result sets: enabled
1719 [main] INFO org.hibernate.cfg.SettingsFactory - JDBC3 getGeneratedKeys(): disabled
1719 [main] INFO org.hibernate.cfg.SettingsFactory - Connection release mode: auto
1720 [main] INFO org.hibernate.cfg.SettingsFactory - Default batch fetch size: 1
1720 [main] INFO org.hibernate.cfg.SettingsFactory - Generate SQL with comments: disabled
1720 [main] INFO org.hibernate.cfg.SettingsFactory - Order SQL updates by primary key: disabled
1720 [main] INFO org.hibernate.cfg.SettingsFactory - Order SQL inserts for batching: disabled
1720 [main] INFO org.hibernate.cfg.SettingsFactory - Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
1723 [main] INFO org.hibernate.hql.ast.ASTQueryTranslatorFactory - Using ASTQueryTranslatorFactory
1723 [main] INFO org.hibernate.cfg.SettingsFactory - Query language substitutions: {}
1723 [main] INFO org.hibernate.cfg.SettingsFactory - JPA-QL strict compliance: disabled
1723 [main] INFO org.hibernate.cfg.SettingsFactory - Second-level cache: enabled
1723 [main] INFO org.hibernate.cfg.SettingsFactory - Query cache: disabled
1723 [main] INFO org.hibernate.cfg.SettingsFactory - Cache region factory : org.hibernate.cache.impl.NoCachingRegionFactory
1723 [main] INFO org.hibernate.cfg.SettingsFactory - Optimize cache for minimal puts: disabled
1723 [main] INFO org.hibernate.cfg.SettingsFactory - Structured second-level cache entries: disabled
1745 [main] INFO org.hibernate.cfg.SettingsFactory - Echoing all SQL to stdout
1746 [main] INFO org.hibernate.cfg.SettingsFactory - Statistics: disabled
1746 [main] INFO org.hibernate.cfg.SettingsFactory - Deleted entity synthetic identifier rollback: disabled
1746 [main] INFO org.hibernate.cfg.SettingsFactory - Default entity-mode: pojo
1746 [main] INFO org.hibernate.cfg.SettingsFactory - Named query checking : enabled
1747 [main] INFO org.hibernate.cfg.SettingsFactory - Check Nullability in Core (should be disabled when Bean Validation is on): enabled
1786 [main] INFO org.hibernate.impl.SessionFactoryImpl - building session factory
1975 [main] INFO org.hibernate.impl.SessionFactoryObjectFactory - Not binding factory to JNDI, no JNDI name configured
1980 [main] INFO org.hibernate.tool.hbm2ddl.SchemaUpdate - Running hbm2ddl schema update
1980 [main] INFO org.hibernate.tool.hbm2ddl.SchemaUpdate - fetching database metadata
1982 [main] INFO org.hibernate.tool.hbm2ddl.SchemaUpdate - updating schema
2008 [main] INFO org.hibernate.tool.hbm2ddl.TableMetadata - table found: .APP.KLIENT
2008 [main] INFO org.hibernate.tool.hbm2ddl.TableMetadata - columns: [id, imie, nazwisko]
2008 [main] INFO org.hibernate.tool.hbm2ddl.TableMetadata - foreign keys: []
2008 [main] INFO org.hibernate.tool.hbm2ddl.TableMetadata - indexes: [sql100707014200030]
2012 [main] INFO org.hibernate.tool.hbm2ddl.SchemaUpdate - schema update complete
Hibernate: select klient0_.id as id0_, klient0_.imie as imie0_, klient0_.nazwisko as nazwisko0_ from Klient klient0_
2398 [main] INFO org.hibernate.impl.SessionFactoryImpl - closing
2398 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - cleaning up connection pool: jdbc:derby://localhost:1527/sample
BUILD SUCCESSFUL (total time: 3 seconds)...całość zestawiona poprawnie. Możemy dalej poznawać Hibernate z pomocą NetBeans IDE 6.9.
Jeśli teraz wykonamy klasę Main z parametrem wejściowym zapisz oraz dwoma innymi - imieniem i nazwiskiem zakładanego klienta, wtedy nastąpi utworzenie odpowiedniego rekordu w tabeli odpowiadającej encji Klient w bazie danych - w naszej konfiguracji tabeli KLIENT.
Zmiana wymaga zdefiniowania nowej konfiguracji uruchomieniowej naszego projektu wybierając Properties z menu kontekstowego projektu.
Wciskając przycisk New... obok listy rozwijalnej przy polu Configuration i nadając nazwę konfiguracji, np. zapisz oraz podając dane wejściowe - zapisz Jacek Laskowski - w polu Arguments definiujemy konfigurację uruchomieniową, której wykonanie spowoduje zapis rekordu do bazy danych.
Wciskamy przycisk OK, aby zapisać zmiany. Tym razem, wciśnięcie F6 zapisze rekord.
run: 6 [main] INFO org.hibernate.cfg.annotations.Version - Hibernate Annotations 3.5.3-Final 35 [main] INFO org.hibernate.cfg.Environment - Hibernate 3.5.3-Final ... Hibernate: insert into Klient (id, imie, nazwisko) values (default, ?, ?) Hibernate: values identity_val_local() ... BUILD SUCCESSFUL (total time: 2 seconds)
Działa!






















