Second Edition of Hibernate in Action
Christian Bauer and Gavin King
November, 2006 | 880 pages
ISBN: 1-932394-88-5
The goal is to map the objects created by a object programming language such as Java to a relational database in order to provide persistent objects, i.e object which can be stored on disk and which do not disappear when the virtual machine shutdowns. Hibernate performs the mapping using configurations files in xml (or other). Here is an example of XML file for a mapping called tasks.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class
name="mytasks.Task"
table="TASKS">
<id
name="id"
column="TASK_NAME">
<generator class="increment"/>
</id>
<property
name="name"
column="Task_NAME"/>
<many-to-one
name="nexttask"
cascade="all"
column="SPOUSE_ID"
foreign-key="FK_NEXT_TASK"/>
</class>
</hibernate-mapping>
a class like:
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class
name="mytasks.Task"
table="TASKS">
<id
name="id"
column="TASK_NAME">
<generator class="increment"/>
</id>
<property
name="name"
column="Task_NAME"/>
<many-to-one
name="nexttask"
cascade="all"
column="SPOUSE_ID"
foreign-key="FK_NEXT_TASK"/>
</class>
</hibernate-mapping>
class Task {
private String name;
private Task nexttask;
}
private String name;
private Task nexttask;
}
package mytasks;
import org.hibernate.*;
import persistence.*;
import java.util.*;
public class TaskExample {
public static void main(String[] args) {
// First unit of work
Session session =
HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
Task firsttask = new Task("Learn Hibernate");
Long meberId = (Long) session.save(firsttask);
tx.commit();
session.close();
// Second unit of work
Session newSession = HibernateUtil.getSessionFactory().openSession();
Transaction newTransaction = newSession.beginTransaction();
List tasks = newSession.createQuery("from Task m order by m.name asc").list();
System.out.println( tasks.size() + " Task(s) found:" );
for ( Iterator iter = members.iterator(); iter.hasNext(); ) {
Tasks task = (Task) iter.next();
System.out.println( task.getName() );
}
newTransaction.commit();
newSession.close();
// Shutting down the application
HibernateUtil.shutdown();
}
}
It is possible to set the configuration file for the session factory using
new Configuration().configure(<locationof config file>);
for example:
import persistence.*;
import java.util.*;
public class TaskExample {
public static void main(String[] args) {
// First unit of work
Session session =
HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
Task firsttask = new Task("Learn Hibernate");
Long meberId = (Long) session.save(firsttask);
tx.commit();
session.close();
// Second unit of work
Session newSession = HibernateUtil.getSessionFactory().openSession();
Transaction newTransaction = newSession.beginTransaction();
List tasks = newSession.createQuery("from Task m order by m.name asc").list();
System.out.println( tasks.size() + " Task(s) found:" );
for ( Iterator iter = members.iterator(); iter.hasNext(); ) {
Tasks task = (Task) iter.next();
System.out.println( task.getName() );
}
newTransaction.commit();
newSession.close();
// Shutting down the application
HibernateUtil.shutdown();
}
}
SessionFactory sessionFactory = new Configuration()
.configure("/persistence/tasks.cfg.xml")
.buildSessionFactory();
calling new Configuration().configure(); would look for a file called: hibernate.properties
in the class path directory outside of any package.
the Hibernate Configuration file:
<!DOCTYPE hibernate-configuration SYSTEM "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">
org.postgresql.Driver </property>
<property name="hibernate.connection.url">
jdbc:postgresqll://localhost
</property>
<property name="hibernate.connection.username">
sa
</property>
<property name="hibernate.dialect">
org.hibernate.dialect.HSQLDialect
</property>
<!-- Use the C3P0 connection pool provider -->
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<!-- Show and print nice SQL on stdout -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- List of XML mapping files -->
<mapping resource="mytasks/tasks.hbm.xml"/>
</session-factory>
</hibernate-configuration>
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">
org.postgresql.Driver </property>
<property name="hibernate.connection.url">
jdbc:postgresqll://localhost
</property>
<property name="hibernate.connection.username">
sa
</property>
<property name="hibernate.dialect">
org.hibernate.dialect.HSQLDialect
</property>
<!-- Use the C3P0 connection pool provider -->
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<!-- Show and print nice SQL on stdout -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- List of XML mapping files -->
<mapping resource="mytasks/tasks.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Note the use of a certain number of configuration entries:
- the Hibernate connection pool provider: here the C3PO-connection-pool-provider
- the hibernate dialect used, here the HSQLDialect
- the connection information: drivers, url and username
- the mapping file
There are a number of other possibilities to configure Hibernate.