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.

Spis treści

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.

Plik:hibernatenetbeans69-javaapplication.png

Wciskamy przycisk Next.

Podajemy dane aplikacji i wciskamy Finish.

Plik:hibernatenetbeans69-newjavaapplication.png

Po chwili, w widoku Projects po lewej, pojawi się struktura projektu HibernateApplication oraz po prawej edytor z klasą główna Main.

Plik:hibernatenetbeans69-projektutworzony.png

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

Plik:hibernatenetbeans69-tools-libraries.png

a następnie wciskamy przycisk New Library...

Plik:hibernatenetbeans69-new-library.png

W okienku dialogowym nadajemy nazwę naszej nowej bibliotece - Hibernate-3.5.3.

Plik:hibernatenetbeans69-new-library-hibernate.png

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.

Plik:hibernatenetbeans69-hibernate-library-classpath.png

Kończymy przyciskiem OK.

Dodanie własnej biblioteki Hibernate-3.5.3

W widoku Projects z menu kontekstowego gałęzi Libraries wybieramy Add Library.

Plik:hibernatenetbeans69-addlibrary.png

Wybieramy bibliotekę Hibernate-3.5.3.

Plik:hibernatenetbeans69-hibernate-library.png

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.

Plik:hibernatenetbeans69-hibernate-hibernateutil.png

Wciskamy przycisk Next >.

Określamy charakterystykę naszej klasy pomocniczej:

  • Class Name: HibernateUtil
  • Package: utils
Plik:hibernatenetbeans69-new-hibernateutil.png

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.

Plik:hibernatenetbeans69-hibernateconfigurationwizard.png

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.

Plik:hibernatenetbeans69-hibernatecfg.png

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.

Plik:hibernatenetbeans69-selectdatasource.png

Zatwierdzamy wybór przyciskiem Finish.

Struktura projektu powinna przedstawiać się jak poniżej.

Plik:hibernatenetbeans69-strukturaprojektowazhibernatecfgxml.png

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 more

Oczywiś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.

Plik:hibernatenetbeans69-javaclass.png

Wciskamy Next, aby w kolejnym kroku zdefiniować klasę - jej nazwę i pakiet.

Plik:hibernatenetbeans69-newjavaclass.png

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.

Plik:hibernatenetbeans69-hibernatemappingwizard.png

Wciskamy przycisk Next >.

W kolejnym kroku akceptujemy proponowane wartości.

Plik:hibernatenetbeans69-nameandlocation.png

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).

Plik:hibernatenetbeans69-selectmappingclass.png

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.

Plik:hibernatenetbeans69-configuration-default-config.png

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.

Plik:hibernatenetbeans69-configuration-zapisz.png

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!

Osobiste