1 Hibernate 1. Wprowadzenie. 2. Uruchomienie dostarczonego przykładu. 3. Własny przykład.
2 Wprowadzenie Hibernate (http://www.hibernate.org) jest narzędziem realizującym odwzorowanie obiektów Javy na odpowiednie rekordy w relacyjnej bazie danych. Hibernate uwalnia programistów od tworzenia większości kodu odpowiedzialnego za komunikację z bazą danych i pozwala się skupić na logice biznesowej tworzonej aplikacji. Ponadto biblioteka umożliwia pisanie programów w sposób niezależny od konkretnej platformy baz danych.
Uruchomienie przykładu załadować: http://www.hibernate.org/30.html i rozpakowanie archiwum, umieścić driver JDBC w podkatalogu lib, wyedytować plik etc/hibernate.properties, i ustawić parametry połączenia z bazą danych:... hibernate.dialect org.hibernate.dialect.mysqldialect #hibernate.dialect org.hibernate.dialect.mysqlinnodbdialect #hibernate.dialect org.hibernate.dialect.mysqlmyisamdialect hibernate.connection.driver_class com.mysql.jdbc.driver hibernate.connection.url jdbc:mysql://127.0.0.1/eg hibernate.connection.username root hibernate.connection.password... 3
4 Uruchomienie przykładu ustawić hibernate.show_sql=true w pliku hibernate.properties z linii komend wewnątrz katalogu hibernate wydać polecenie ant eg, przejrzeć dane pojawiające się w konsoli, przejrzeć źródła w podkatalogu eg.
5 Własny przykład contractors orders con_id con_name con_address odr_id odr_date
6 Struktura przykładu +src +data Contractor.java ContractorManager.java Contractor.hbm.xml Order.java OrderManager.java Order.hbm.xml +util HibernateUtil.java Example.java hibermate.cfg.xml log4j.properties
7 Contractor.java package data; import java.util.hashset; import java.util.set; public class Contractor { private int id; private String name; private String address; private Set orders = new HashSet(); public Contractor(){ // pusty konstruktor
8 Contractor.java public void setid(int id) { this.id = id; public int getid() { return this.id; public void setname(string name) { this.name = name; public String getname() { return this.name;
Contractor.java public void setaddress(string address) { this.address = address; public String getaddress() { return this.address; public void setorders(set orders) { this.orders = orders; public Set getorders() { return this.orders; 9
10 Contractor.hbm.xml Pliki hbm.xml służą do zdefiniowania odwzorowania relacyjno-obiektowego: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernatemapping-3.0.dtd"> <hibernate-mapping> <class name="data.contractor" table="contractors"> <id name="id" column="con_id"> </id> <generator class="native"/>
11 Contractor.hbm.xml <property name="name" column="con_name"/> <property name="address" column="con_address"/> <set name="orders" inverse="true"> <key column="con_id"/> <one-to-many class="data.order"/> </set> </class> </hibernate-mapping>
Order.java... public class Order { private int id; private Date date; private Contractor contractor; public Order(){ // pusty konstruktor public void setid(int id) { this.id = id; public int getid() { return this.id;... 12
13 Order.hbm.xml... <hibernate-mapping> <class name="data.order" table="orders"> <id name="id" column="odr_id"> </id> <generator class="native"/> <property name="date" type="date" column="odr_date"/> <many-to-one name="contractor" column="con_id" class="data.contractor" /> </class> </hibernate-mapping>
14 Struktura przykładu +src +data Contractor.java Contractor.hbm.xml Order.java Order.hbm.xml ContractorManager.java OrderManager.java +util HibernateUtil.java Example.java hibermate.cfg.xml log4j.properties
ContractorManager.java Plik ContractorManager.java zawiera definicję operacji związanych z obiektem Contractor:... public class ContractorManager { public void create(string sname, String saddress) { Session session = HibernateUtil.getSessionFactory(). getcurrentsession(); session.begintransaction(); Contractor c = new Contractor(); c.setname(sname); c.setaddress(saddress); session.save(c); session.gettransaction().commit(); 15
16 ContractorManager.java public Contractor load(int id) { Session session = HibernateUtil.getSessionFactory(). getcurrentsession(); session.begintransaction(); Contractor c = (Contractor) session.load( Contractor.class, new Integer(id)); session.gettransaction().commit(); return c;
17 HibernateUtil.java W pliku HibernateUtil.java zawarto kod inicjujący bibliotekę Hibernate. package util; import org.hibernate.sessionfactory; import org.hibernate.cfg.configuration; public class HibernateUtil { private static final SessionFactory sessionfactory;
HibernateUtil.java static { try { // inicjalizacja na podstawie konfiguracji z pliku // hibernate.cfg.xml sessionfactory = new Configuration().configure(). buildsessionfactory(); catch (Throwable ex) { System.err.println("failure " + ex); throw new ExceptionInInitializerError(ex); public static SessionFactory getsessionfactory() { return sessionfactory; 18
19 Struktura przykładu +src +data Contractor.java Contractor.hbm.xml Order.java Order.hbm.xml ContractorManager.java OrderManager.java +util HibernateUtil.java Example.java hibermate.cfg.xml log4j.properties
Example.java public class Example { public static void main(string[] args) { ContractorManager cm = new ContractorManager(); if (args[0].equals("create")) { Contractor c1, c2; cm.create("adam", "Lesna 11/3"); cm.create("tomasz", "Zielona 123/65"); cm.create("pawel", "Krotka 6"); c1 = cm.load(1); c2 = cm.load(2); OrderManager om = new OrderManager(); om.create(c1); om.create(c2); om.create(c1); 20
21 Example.java else if (args[0].equals("print")) { Order o; Session session = HibernateUtil.getSessionFactory(). GetCurrentSession(); session.begintransaction(); List l = session.createquery( "from Contractor").list(); for (int i = 0; i < l.size(); i++) { Contractor c = (Contractor) l.get(i); System.out.println("Contractor:"); System.out.println(String.valueOf(c.getId()) + ", " + String.valueOf(c.getName()) + ", " + String.valueOf(c.getAddress()));
22 Example.java for( Iterator it = c.getorders().iterator(); it.hasnext(); ){ o = (Order) it.next(); System.out.println("Order: " + String.valueOf(o.getId()) + ", " + o.getdate()); session.gettransaction().commit(); HibernateUtil.getSessionFactory().close();
Hibernate.cfg.xml Plik hibernate.cfg.xml określa konfigurację biblioteki Hibernate: <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernateconfiguration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="connection.driver_class"> com.mysql.jdbc.driver </property> <property name="connection.url"> jdbc:mysql://localhost/example </property> 23
24 Hibernate.cfg.xml <property name="connection.username">root</property> <property name="connection.password"></property> <property name="connection.pool_size">1</property> <property name="dialect"> org.hibernate.dialect.mysqldialect </property> <property name="current_session_context_class"> thread </property> <property name="cache.provider_class"> org.hibernate.cache.nocacheprovider </property>
25 Hibernate.cfg.xml <property name="show_sql">true</property> <property name="hbm2ddl.auto">create</property> <mapping resource="data/contractor.hbm.xml"/> <mapping resource="data/order.hbm.xml"/> </session-factory> </hibernate-configuration>
26 Uruchomienie przykładu Niezbędne biblioteki: antlr.jar asm.jar asm-attrs.jars cglib.jar commons-collections.jar commons-logging.jar dom4j.jar hibernate3.jar jta.jar log4j.jar mysql-connector-java-3.1.8 pierwsze uruchomienie spowoduje utworzenie odpowiednich tabel: java -cp [biblioteki] Example create
27 Uruchomienie przykładu... 08:35:52,777 INFO Configuration:1308 - configuring from resource: /hibernate.cfg.xml... 08:35:52,924 INFO Configuration:469 - Reading mappings from resource: data/contractor.hbm.xml 08:35:53,083 INFO HbmBinder:309 - Mapping class: data.contractor -> contractors 08:35:53,144 INFO Configuration:469 - Reading mappings from resource: data/order.hbm.xml 08:35:53,207 INFO HbmBinder:309 - Mapping class: data.order -> orders... 08:35:53,329 INFO HbmBinder:2349 - Mapping collection: data.contractor.orders -> orders... 08:35:53,360 INFO DriverManagerConnectionProvider:80 - using driver: com.mysql.jdbc.driver at URL: jdbc:mysql://localhost/example 08:35:53,361 INFO DriverManagerConnectionProvider:86 - connection properties: {user=root, password=****
Uruchomienie przykładu... 08:35:55,199 DEBUG SchemaExport:301 - create table contractors (con_id integer not null auto_increment, con_name varchar(255), con_address varchar(255), primary key (con_id)) 08:35:55,205 DEBUG SchemaExport:301 - create table orders (odr_id integer not null auto_increment, odr_date date, con_id integer, primary key (odr_id)) 08:35:55,213 DEBUG SchemaExport:301 - alter table orders add index FKC3DF62E5B8CC0851 (con_id), add constraint FKC3DF62E5B8CC0851 foreign key (con_id) references contractors (con_id)... Hibernate: insert into contractors (con_name, con_address) values (?,?) Hibernate: insert into contractors (con_name, con_address) values (?,?) Hibernate: insert into contractors (con_name, con_address) values (?,?) Hibernate: insert into orders (odr_date, con_id) values (?,?) Hibernate: insert into orders (odr_date, con_id) values (?,?) Hibernate: insert into orders (odr_date, con_id) values (?,?) 08:35:55,740 INFO SessionFactoryImpl:729 - closing 08:35:55,744 INFO DriverManagerConnectionProvider:147 - cleaning up connection pool: jdbc:mysql://localhost/example 28
Drugie uruchomienie programu: Uruchomienie przykładu z pliku hibernate.cfg.xml usuwamy element: <property name="hbm2ddl.auto">create</property> java -cp [biblioteki] Example print Hibernate: select contractor0_.con_id as con1_0_, contractor0_.con_name as con2_0_, contractor0_.con_address as con3_0_ from contractors contractor0_ Contractor: 1, Adam, Lesna 11/3 Hibernate: select orders0_.con_id as con3_1_, orders0_.odr_id as odr1_1_, orders0_.odr_id as odr1_1_0_, orders0_.odr_date as odr2_1_0_, orders0_.con_id as con3_1_0_ from orders orders0_ where orders0_.con_id=? Order: 3, 2006-04-11 Order: 1, 2006-04-11 Contractor:... 29
30 Podsumowanie Hibernate jest obecnie standardem w dziedzinie ORM. Biblioteka ta jest odpowiedzialna za zarządzanie trwałymi obiektami w ramach technologii JEE. Istnieje także jej wersja dla środowiska.net.