V pátek 26. dubna 2024 úderem 22 hodiny začíná naše nová
a opravdu velká série soutěží o nejlepší webovou stránku !!
Proto neváhejte a začněte hned zítra soutěžit o lákavé ceny !!

Hibernate

Z Multimediaexpo.cz

Hibernate je framework napsaný v jazyce Java, který umožňuje tzv. objektově-relační mapování (ORM). Usnadňuje řešení otázky zachování dat z objektů i po ukončení běhu aplikace. Provádí podobné věci jako např. JPA – Java Persistence API.

Obsah

Historie

Projekt vytvořil Gavin King, který později spolu s Hibernate přešel pod křídla firmy JBoss. Ta byla v roce 2006 převzata firmou Red Hat, která nadále pokračuje ve vývoji frameworku Hibernate. Gavin King spolu s JBoss také přešel do RedHatu.

Co dělá hibernate

Hibernate poskytuje způsob, pomocí nějž je možné zachovat stav objektů mezi dvěma spuštěními aplikacemi. Říkáme tedy, že udržuje data persistentní. Dosahuje toho pomocí ORM, což znamená, že mapuje Javovské objekty na entity v relační databázi. K tomu používá tzv. mapovací soubory, ve kterých je popsáno, jakým způsobem se mají data z objektu transformovat do databáze a naopak, jakým způsobem se z databázových tabulek mají vytvořit objekty. Druhý způsob, jak mapovat objekty, je použít anotace místo mapovacích souborů. V Hibernate tedy pracujete se svými normálními business objekty, pouze pro každý atribut přidáte get/set metody a metody hashCode() a equals(). Nutno podotknout, že nelze použít EJB (viz.Java Bean), ale pouze tzv. POJO (Plain Old Java Object). Poté, co máte objekty uložené v databázi se na ně můžete dotazovat jazykem HQL (Hibernate Query Language), který je odvozen z SQL a je mu tedy velice podobný.

Mapování

a) mapovací soubory

Jedná se soubory ve formátu XML s příponou „hbm.xml“, kdy pro jednu třídu máme jeden soubor, obyčejně (nebo povinně??) umístěn ve stejném adresáři jako samotná třída. Ve struktuře mapovacího souboru se používají např. tagy <property> nebo <set>. Prvním se popisuje normální datový atribut třídy. Tagem <set> se také popisuje atribut, ale tentokrát má speciální význam, protože udžuje odkazy na související objekty. (Např.: Objekt „Zajezd“ by měl v sobě atribut typu java.util.Set se jménem „cestujici“, který by obsahoval odkazy na objekty jednotlivých cestujících)

  <hibernate-mapping package="model">
    <class name="Country">
 
      <id name="id" column="COUNTRY_ID" type="long">
        <generator class="native"></generator>
      </id>
 
      <property name="nazevZajezdu" column="NAZEV" not-null="true" unique="true"></property>
      <property name="atribut1" column="ATRIBUT1"></property>
      <property name="atribut2" column="ATRIBUT2"></property>
 
      <set name="cestujici"> 
        <!-- nazev atributu v Country -->
        <key column="CESTUJICI_ID"></key>
        <!-- KEY je nazev soupce FK v tabulce CESTUJICI, ktery odkazuje na ZAJEZD -->
        <one-to-many class="Site" />
      </set>
 
    </class>
  </hibernate-mapping>

b) anotace

Anotace lze použít dvěma způsoby – buďto u atributů nebo u jejich getterů. Následují výpisy, které ukazují použití obojího.

Použití anotací u atributů:

@Entity(access = AccessType.FIELD)
@Table (name="ZAJEZD")
public class Zajezd {
 
   @Id (generate = GeneratorType.AUTO)
   private Long id;
 
   @Column (length=100, nullable=false, unique=true)
   private String nazev;
 
   @Column (length=100)
   private String atribut1;
 
   @Column (length=30)
   private String atribut2;
 
   private Set<Osoba> cestujici;

Použití anotací u metod:

@Entity(access = AccessType.PROPERTY)
@Table (name="ZAJEZD")
public class Zajezd {
 
   private Long id,
   private String nazev;
   private String atribut1;
   private String atribut2;
   private Set<Osoba> cestujici;
 
   @Id (generate = GeneratorType.AUTO)
   public int getId() {
      return id;
   }
 
   @Column (length=100)
   public String getNazev() {
      return name;
   }
 
   @Column (length=100)
   public String getAtribut1() {
      return address;
   }
 
   @Column (length=30)
   public String getAtribut2() {
      return email;
   }
 
   public void setXXX() {
      ....
   }
 
}

Konfigurační soubor pro Hibernate

Hibernate potřebuje pro správnou funkci několik nastavení. Jsou např.: JDBC driver, connection string, typ databáze (dialect), ale také cesty k mapovacím souborům.

<hibernate-configuration>
    <session-factory>
    	<property name="hibernate.connection.driver_class">
          org.apache.derby.jdbc.ClientDriver
        </property>
 
        <property name="hibernate.dialect">
         org.hibernate.dialect.DerbyDialect
        </property>
 
        <property name="hibernate.connection.url">
          jdbc:derby://localhost:1527/c:/temp/databaze;create=true
        </property>
 
        <property name="hibernate.connection.username">uzivatel</property>
        <property name="hibernate.connection.password">heslo</property>
 
        <property name="hibernate.hbm2ddl.auto">create</property>
 
        <!--  mapping files  -->
        <mapping resource="model/Zajezd.hbm.xml"/>
        <mapping resource="model/Cestujici.hbm.xml" />
 
    </session-factory>
</hibernate-configuration>

HQL – Hibernate Query Language

Preferovaný způsob práce s objekty je HQL (oproti SQL). Syntaxe je SQL velice podobná, ale HQL je, narozdíl od SQL, objektově orientované, takže rozumí věcem jako dědičnost, polymorfismus, apod. Dotaz „from java.lang.Object o“ by tedy vrátil úplně všechny persistentní objekty. Nejjednodušší dotaz vypadá takto: „from Zajezd“ – vrátí všechny instance třídy Zajezd.

Pokud se v dotazu chceme odvolávat na „Zajezd“, je potřeba mu přiřadit alias: „from Zajezd as zajezd“ – je zvykem pojmenovávat aliasy stejným slovem jako název třídy, ale podle konvence, kterou pojmenováváme atributy. Použili bychom toho následujícím způsobem: „from Zajezd as zajezd where zajezd.nazev = nazev“

HQL podporuje klasické kostrukce, na které jsme zvyklí z SQL, jako jsou: inner a outer joiny, klauzule where nebo with, agregační výrazy jako avg() nebo count(), subdotazy, atd, atd. Další zajímavostí je QBE – Query by Example. Jedná se způsob dotazování, kdy vytvoříme nový objekt s vlastnostmi, které hledáme a tento objekt poté předáme do HQL a ten nám vrátí objekty se stejnými vlastnostmi.

Zajezd z = new Zajezd();
z.setCestujici(cestujici);
z.setNazev(„Nazev Zajezdu“);
List vysledek = session.createCriteria(Zajezd.class)
    .add( Example.create(z) )
    .list();

V předchozím příkladu byla použita konstrukce „Criteria“. QBE je ve skutečnosti pouze jedním z více druhů kritérií, které můžeme pro dotazy zavádět. V obecnější rovině vypadají kritéri následovně:

Criteria crit = sess.createCriteria(Zajezd.class);
crit.setMaxResults(50);
List zajezdy = crit.list();

nebo:

List zajezdy = sess.createCriteria(Zajezd.class)
    .add( Restrictions.like("nazev", "Kostarika%") )
    .add( Restrictions.or(
        Restrictions.eq( "atribut1", hledanaHodnota ),
        Restrictions.isNull("atribut2")
    ) )
    .list();

Výhody používání Hibernate

Hibernate, framework pro perzistentní vrstvu, usnadňuje programátorovi práci tím, že nemusí transformovat objekty do relací ručně, ale přenechá to perzistentní vrstvě. Zároveň jsou tím odstíněna specifika jednotlivých databází – programátor používá API Hibernate.

Externí odkazy

Další podobné frameworky