A (very) high-level view of the Hibernate architecture:
This diagram shows Hibernate using the database and configuration data to provide persistence services (and persistent objects) to the application.
We would like to show a more detailed view of the runtime architecture. Unfortunately, Hibernate is flexible and supports several approaches. We will show the two extremes. The "lite" architecture has the application provide its own JDBC connections and manage its own transactions. This approach uses a minimal subset of Hibernate's APIs:
The "full cream" architecture abstracts the application away from the underlying JDBC/JTA APIs and lets Hibernate take care of the details.
Heres some definitions of the objects in the diagrams:
org.hibernate.SessionFactory
)
A threadsafe (immutable) cache of compiled mappings for a single database.
A factory for Session
and a client of
ConnectionProvider
. Might hold an optional (second-level)
cache of data that is reusable between transactions, at a
process- or cluster-level.
org.hibernate.Session
)
A single-threaded, short-lived object representing a conversation between
the application and the persistent store. Wraps a JDBC connection. Factory
for Transaction
. Holds a mandatory (first-level) cache
of persistent objects, used when navigating the object graph or looking up
objects by identifier.
Short-lived, single threaded objects containing persistent state and business
function. These might be ordinary JavaBeans/POJOs, the only special thing about
them is that they are currently associated with (exactly one)
Session
. As soon as the Session
is closed,
they will be detached and free to use in any application layer (e.g. directly
as data transfer objects to and from presentation).
Instances of persistent classes that are not currently associated with a
Session
. They may have been instantiated by
the application and not (yet) persisted or they may have been instantiated by a
closed Session
.
org.hibernate.Transaction
)
(Optional) A single-threaded, short-lived object used by the application to
specify atomic units of work. Abstracts application from underlying JDBC,
JTA or CORBA transaction. A Session
might span several
Transaction
s in some cases. However, transaction demarcation,
either using the underlying API or Transaction
, is never
optional!
org.hibernate.connection.ConnectionProvider
)
(Optional) A factory for (and pool of) JDBC connections. Abstracts application from
underlying Datasource
or DriverManager
.
Not exposed to application, but can be extended/implemented by the developer.
org.hibernate.TransactionFactory
)
(Optional) A factory for Transaction
instances. Not exposed to the
application, but can be extended/implemented by the developer.
Hibernate offers many optional extension interfaces you can implement to customize the behavior of your persistence layer. See the API documentation for details.
Given a "lite" architecture, the application bypasses the
Transaction
/TransactionFactory
and/or
ConnectionProvider
APIs to talk to JTA or JDBC directly.