The Open Session in View pattern is very popular when Hibernate is used in a web application. This allows you to safely use managed entities when your view is being rendered. At Terracotta, we're currently researching what other patterns are popular for Hibernate and how people apply them.
One that I'm in particular looking into is the Extended Session pattern for long running conversations. This allows you to disconnect a Hibernate session in between requests and to store it in the HTTP session in the meantime.
I'd like to know who's using the extended session pattern and what you use it for.
To understand more about this, I developed a small example application to get a feel for the advantages, the benefits, the gotchas and the surprises. The application can be found below, it is inspired by snippets from Hibernate tutorials and example applications:
The example uses only servlets, filters and Hibernate. It is a webapp that allows you to create events and add people to it over different requests. When an event has been created with all the relevant people, it can be committed in one step. The intermediate state is kept within the managed entities and the Hibernate session until it's flushed.
This is what I found worth mentioning:
- Whenever a transaction is created and committed, it doesn't matter if Hibernate flush mode is set to manual, certain operations like persist and merge will be propagated to the database at transaction commit. However, modifications to managed entities wont be committed, this can be confusing.
- Even with manually flushed sessions, transactions are always real database transactions, causing locks to be held. They thus need to be as short as possible.
- A single general-purpose servlet filter might not be feasible, depending on how transactions should behave. In this application, I ended up creating only a transaction around the actual session flush.
- Data that is present in a manually flushed session buffer is batched but not available for queries.
- This doesn't behave the same as a database transaction with isolation levels that can still see their own changes.
- If the data needs to be available for a query, a commit needs to happen first.
- This can require application changes, like a redirect after form submission in case transactions are automatically committed through a servlet filter.
Totally unrelated but cool, you can use an
AnnotationConfiguration class to setup the Hibernate config and use a fluent interface to add the managed entity classes. This reduces the amount of XML and eases maintenance (see
HibernateUtil class in my example).