1.2.5. Startup and helpers
It's time to load and store some Event
objects, but first we have to complete the setup with some infrastructure code. We have to startup Hibernate. This startup includes building a global SessionFactory
object and to store it somewhere for easy access in application code. A SessionFactory
can open up new Session
's. A Session
represents a single-threaded unit of work, the SessionFactory
is a thread-safe global object, instantiated once.
We'll create a HibernateUtil
helper class which takes care of startup and makes accessing a SessionFactory
convenient. Let's have a look at the implementation:
package util;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
// Create the SessionFactory from hibernate.cfg.xml
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
This class does not only produce the global SessionFactory
in its static initializer (called once by the JVM when the class is loaded), but also hides the fact that it uses a static singleton. It might as well lookup the SessionFactory
from JNDI in an application server.
If you give the SessionFactory
a name in your configuration file, Hibernate will in fact try to bind it to JNDI after it has been built. To avoid this code completely you could also use JMX deployment and let the JMX-capable container instantiate and bind a HibernateService
to JNDI. These advanced options are discussed in the Hibernate reference documentation.
Place HibernateUtil.java
in the development source directory, in a package next to events
:
.
+lib
<Hibernate and third-party libraries>
+src
+events
Event.java
Event.hbm.xml
+util
HibernateUtil.java
hibernate.cfg.xml
+data
build.xml
This should again compile without problems. We finally need to configure a logging system - Hibernate uses commons logging and leaves you the choice between Log4j and JDK 1.4 logging. Most developers prefer Log4j: copy log4j.properties
from the Hibernate distribution (it's in the etc/
directory) to your src
directory, next to hibernate.cfg.xml
. Have a look at the example configuration and change the settings if you like to have more verbose output. By default, only Hibernate startup message are shown on stdout.
The tutorial infrastructure is complete - and we are ready to do some real work with Hibernate.