Title: Java - HIBERNATE
1Java-HIBERNATE
Przygotowali Lukasz Monkiewicz, Lukasz Zawadzki
2Plan prezentacji
- Co to jest Hibernate??
- Podstawowe cechy Hibernate
- Dlaczego Hibernate jest wartosciowa technologia??
- Podstawowe elementy rozwijanej aplikacji
- Uzycie zlozonych relacji i zapytan, kryteriów,
dziedziczenia - XDoclet a HIBERNATE
- Porównanie do EJB
3Co to jest hibernate??
- Jest to technologia wysokiej wydajnosci i
szybkosci dzialania sluzaca do wykonywania
operacji na obiektowo relacyjnych bazach danych
z poziomu jezyka Java
4Podstawowe cechy technologii Hibernate
- Nie ma potrzeby implementowania interfejsów
- Dowolna klasa moze byc klasa reprezentujaca encje
- Wygodne i intuicyjne mapowanie plików struktury
xml na klasy - Mniej kodu mniej bledów
- Optymalna wydajnosc
5Dlaczego warto nauczyc sie Hibernate
- Proste zasady dzialania
- Mozliwosc korzystania z mozliwosci SQL bez
wychodzenia poza granice jezyka Java - Mozliwosc stworzenia duzej bazy bez wiekszego
wkladu pracy - Open source
- Dostepnosc narzedzi open source
- Popularnosc
6Podstawowe elementy Aplikacji
- Klasa reprezentujaca encje
- Posiada metody get i set dla atrybutów klasy
pól w tabeli - Class Entity
-
- int id
- private void setId(int id)
-
- this.id id
-
- public int getId()
-
- return id
-
-
7Podstawowe elementy Aplikacji c.d.
- Posiada bez argumentowy konstruktor.
- Plik mapowania(Entity.hbm.xml)
- lthibernate-mappinggt
- ltclass name"Entity" tableEntity"gt
- ltid name"id" column"ID"gt
- ltgenerator class"increment"/gt
- lt/idgt
- ltproperty name"date" type"timestamp"
column"DATE"/gt - ltproperty name"title"/gt
- lt/classgt
- lt/hibernate-mappinggt
8Podstawowe elementy Aplikacji c.d.
- Plik konfiguracji (hibernate.properties lub
hibernate.cfg.xml) - lthibernate-configurationgt
- ltsession-factorygt
- lt!-- Database connection settings --gt
- ltproperty name"connection.driver_class"gt
- org.hsqldb.jdbcDriver
- lt/propertygt
- ltproperty name"connection.url"gt
- jdbchsqldbdata/tutorial
- lt/propertygt
- ltproperty name"connection.username"gt
- sa
- lt/propertygt
- ltproperty name"connection.password"gt
- lt/propertygt
- ltproperty name"dialect"gtorg.hibernate.dialect.
HSQLDialect - lt/propertygt
- ltproperty name"show_sql"gt
9Podstawowe elementy Aplikacji c.d.
- Przykladowy kod wykonywalny
- class EntityManager
-
- public static void main(String args)
-
- EntityManager em new EntityMenager()
- em.createAndStoreSomething(nazwa, new
Date()) -
-
10Podstawowe elementy Aplikacji c.d.
- Przykladowy kod wykonywalny
- public void createAndStoreSomething(String title,
new Date()) - public static final SessionFactory
sessionFactory new Configuration().configure().b
uildSessionFactory() - public static final ThreadLocal session new
ThreadLocal() - Session s (Session) session.get()
- if( s null)
- s sessionFactory.openSession()
- session.set(s)
-
- Transaction tx s.beginTransaction()
- Entity ent new Entity()
- ent.setTitle(title)
- ent.setDate(theDate)
- s.save(theEvent)
- tx.commit()
- s.close()
- session.set(null)
11Podstawowe elementy Aplikacji c.d.
- Przedstawienie relacji miedzy tabelami
- _________________
_________________ - PERSON
Entity - _______________
_______________ - person_id
0..1 ID - name ------------------------
---------- title -
date -
-
- _______________
________________
12Podstawowe elementy Aplikacji c.d.
- Klasa Person.java
- class Person
-
- int person_id
- String name
- Entity ent
- //metody get i set dla atrybutów
- public Entity getEntity()
- return ent
-
- public void setEntity(Entity ent)
- this.ent ent
-
13Podstawowe elementy Aplikacji c.d.
- Person.hbm.xml
- lthibernate-mappinggt
- ltclass namePerson" tablePersons"gt
- ltid nameperson_id" columnPERSON_ID"gt
- ltgenerator class"increment"/gt
- lt/idgt
- ltproperty namename/gt
- ltmany-to-one
- nameent column"ID"
- classEntity not-null"true"/gt
- lt/classgt
- lt/hibernate-mappinggt
14Podstawowe elementy Aplikacji c.d.
- Klasa Entity.java
- class Entity
- private Set persons new HashSet()
-
- public void setPersons(Set persons)
- this.persons persons
-
- public Set getPersons()
- return persons
-
-
-
-
-
15Podstawowe elementy Aplikacji c.d.
- Entity.hbm.xml
- lthibernate-mappinggt
- ltclass name"Entity" tableEntity"gt
-
-
- ltset namepersons"gt
- ltkey columnID"/gt
- ltone-to-many classPerson"/gt
- lt/setgt
- lt/classgt
- lt/hibernate-mappinggt
-
-
-
16Podstawowe elementy Aplikacji c.d.
- Przykladowy kod wykorzystujacy relacje
- class EntityManager
-
- public static void main(String args)
- public static final SessionFactory
sessionFactory new Configuration().configur
e().buildSessionFactory() - public static final ThreadLocal session new
ThreadLocal() - Session s (Session) session.get()
- if( s null)
- s sessionFactory.openSession()
- session.set(s)
-
- Transaction tx s.beginTransaction()
- Person aPerson (Person) session.load(Person.cl
ass, 2) - Entity anEntity (Entity) session.load(Event.cl
ass, 1) - anEntity.getPersons().add(aPerson)
- tx.commit()
- s.close()
- session.set(null)
17Zlozone zapytania
- List mothers session.createQuery(
- "select mother from Cat as cat join cat.mother
as mother where cat.name ?") - .setString(0, name)
- .list()
- List kittens session.createQuery(
- "from Cat as cat where cat.mother ?")
- .setEntity(0, pk)
- .list()
- Cat mother (Cat) session.createQuery(
- "select cat.mother from Cat as cat where cat
?") - .setEntity(0, izi)
- .uniqueResult()
18Kryteria
- List cats sess.createCriteria(Cat.class)
- .add( Restrictions.like("name", "Fritz") )
- .add( Restrictions.or(
- Restrictions.eq( "age", new Integer(0) ),
- Restrictions.isNull("age")
- ) )
- .list()
- List cats sess.createCriteria(Cat.class)
- .add( Restrictions.sql(
- "lower(alias.name) like lower(?)", "Fritz",
Hibernate.STRING - ) )
- .list()
19Dziedziczenie
- public class Person
- String name
- Long id
- ... // getter, setter
-
- public class Employee extends Person
- String NIP
- ... // getter, setter
-
20Dziedziczenie
- ltclass name"Person" table"persons"
discriminator-value"P"gt - ltid name"id"gt
- ltgenerator class"native"/gt
- lt/idgt
- ltdiscriminator column"subclass"
type"character"/gt - ltproperty name"name" type"string"/gt
-
- ltsubclass name"Employee" discriminator-valueE"
gt - ltproperty name"NIP" type"string"/gt
- lt/subclassgt
- lt/classgt
21Relacje wiele do wiele
- ltclass name"Person"gt
- ltid name"id" column"personId"gt
- ltgenerator class"native"/gt
- lt/idgt
- ltset name"addresses"gt
- ltkey column"personId"/gt
- ltmany-to-many column"addressId"
class"Address"/gt - lt/setgt
- lt/classgt
- ltclass name"Address"gt
- ltid name"id" column"addressId"gt
- ltgenerator class"native"/gt
- lt/idgt
- ltset name"people" inverse"true"gt
- ltkey column"addressId"/gt
- ltmany-to-many column"personId"
class"Person"/gt - lt/setgt
- lt/classgt
22XDoclet i Hibernate
- /
- _at_hibernate.class
- table"Person"
- /
- public class Person
- private Long id
- private String name
- /
- _at_hibernate.id
- generator-class"native"
- column"PERSON_ID"
- /
- public Long getId() return id
- private void setId(Long id) this.idid
- /
- _at_hibernate.property
- column"NAME"
- /
23Porównanie do EJB
- Mniej zbednego kodu
- Nie wymaga serwera aplikacji
- Wydajnosc
- Rozbudowany jezyk zapytan
24Podsumowanie
- Technologia popularna ( ok. 1500 pobran dziennie
) - Prosta implementacja a efekt dzialania aplikacji
- Wiecej na www.hibernate.org
- Literatura Hibernate in action wyd. Manning
-
-
-