Lehký úvod do systému Hibernate

Princip

Příklad

Mějme třídy Product a Group, které reprezentují jednoduchý katalog produktů:

Product.java:

public class Product {

  private double price;
    private String name;
    private int oid;
   
    Product(int oid, String name, double price) {
        this.setOid(oid);
        this.setPrice(price);
        this.setName(name);
    }
   
    Product() { }
   
    public double getPrice() {
        return this.price;
    }
 
    public void setPrice(double price) {
        this.price = price;
    }
   
    public String getName() {
        return name;
    }
   
    public void setName(String name) {
        this.name = name;
    }
   
    public int getOid() {
        return oid;
    }
   
    public void setOid(int oid) {
        this.oid = oid;
    }
}

Group.java:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Group {
   
    private List products = new ArrayList();
    private List childGroups = new ArrayList();
    private int oid;
    private String name;
   
    Group() {
    }
   
    Group(int oid, String name) {
                this.setOid(oid);
                this.setName(name);
    }
       
    public List getProducts() {
        return products;
    }

    public List getChildGroups() {
        return childGroups;
    }
       
    private void setChildGroups(List childGroups) {
        this.childGroups = childGroups;
    }
   
    private void setProducts(List products) {
        this.products = products;
    }

    public int getOid() {
        return oid;
    }

    private void setOid(int oid) {
        this.oid = oid;
    }

    public String getName() {
        return name;
    }

    private void setName(String name) {
        this.name = name;
    }

}

Co musí splňovat třída, kterou chceme mapovat na relační databázi pomocí Hibernate:

Nyní vytvoříme soubory popisující mapování objektů:

Product.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC '-//Hibernate/Hibernate Mapping DTD//EN'
    'http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd'>

 <hibernate-mapping>
    <class name="Product" table="products">
        <id name="oid" unsaved-value="0" column="oid">
            <generator class="identity"/>
        </id>
        <property name="name"/>
        <property name="price"/>
    </class>
</hibernate-mapping>

Group.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC '-//Hibernate/Hibernate Mapping DTD//EN'
    'http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd'>

<hibernate-mapping>
    <class name="Group" table="groups">
        <id name="oid" unsaved-value="0" column="oid">
            <generator class="identity"/>
        </id>
        <property name="name"/>
        <bag name="products" lazy="true" cascade="save-update">
            <key column="group"/>
            <one-to-many class="Product"/>
        </bag>
        <bag name="childGroups" lazy="true" cascade="save-update">
            <key column="parentGroup"/>
            <one-to-many class="Group"/>
        </bag>
    </class>
</hibernate-mapping>

Nyní můžeme přistoupit ke kódu, který bude naše třídy používat. Nejříve je nutné nakonfigurovat Hibernate. To je možné udělat buď programově nebo pomocí konfiguračních souborů.

import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.Transaction;
import net.sf.hibernate.cfg.Configuration;
import net.sf.hibernate.cfg.Environment;

public class Test {
   
    public static void main(String[] args) throws HibernateException {
       
        // Je lepší použít konfiguraci uloženou v XML
        // nebo property souboru - viz dokumentace ke
        // třídě Configuration
       
        Configuration cfg = new Configuration()
        // Které třídy chceme používat
        .addClass(Product.class)
        .addClass(Group.class)
       
        //.setProperty(Environment.HBM2DDL_AUTO, "create")
        .setProperty("hibernate.jdbc.batch_size", "0")
        //
        .setProperty(Environment.DIALECT,"net.sf.hibernate.dialect.HSQLDialect")
        .setProperty(Environment.DRIVER, "org.hsqldb.jdbcDriver")
        .setProperty(Environment.URL, "jdbc:hsqldb:.")
        .setProperty(Environment.USER, "sa")
        .setProperty(Environment.PASS, "")
       
        // velmi užitečné zejména při ladění
        .setProperty("hibernate.show_sql", "true");
        SessionFactory sessionFactory = cfg.buildSessionFactory();
       
        // Session reprezentuje jednu 'jednotku práce'
        // Není thread safe a její vytvoření je levná operace
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
       
        // Vytvoříme nový objekt; zatím není perzistentní...
        Product product = new Product();
        product.setName("Žehlička");
        product.setPrice(1250);
       
        // Tímto voláním dosáhneme toho, že se objekt stává perzistentním.
        // Hibernate pvygeneruje primární klíč a vloží objekt do databáze.
        // Všechny jeho další změny se do ukládají samy (při zavolání commit)
        session.save(product);
       
        tx.commit();
        session.close();

    }

Několik rad na závěr