Mějme třídy Product
a Group
, které
reprezentují jednoduchý katalog produktů:
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;
}
}
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ů:
<?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>
<?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();
}