Package org.hibernate

Interface SessionFactory

All Superinterfaces:
AutoCloseable,EntityManagerFactory,Referenceable,Serializable
All Known Subinterfaces:
SessionFactoryImplementor
All Known Implementing Classes:
SessionFactoryDelegatingImpl,SessionFactoryImpl

public interfaceSessionFactoryextendsEntityManagerFactory,Referenceable,Serializable
ASessionFactory represents an "instance" of Hibernate: it maintains the runtime metamodel representing persistent entities, their attributes, their associations, and their mappings to relational database tables, along withconfiguration that affects the runtime behavior of Hibernate, and instances of services that Hibernate needs to perform its duties.

Crucially, this is where a program comes to obtainsessions. Typically, a program has a singleSessionFactory instance, and must obtain a newSession instance from the factory each time it services a client request. It is then also responsible fordestroying the session at the end of the client request.

TheinSession(java.util.function.Consumer<? super org.hibernate.Session>) andinTransaction(java.util.function.Consumer<? super org.hibernate.Session>) methods provide a convenient way to obtain a session, with or without starting a transaction, and have it cleaned up automatically, relieving the program of the need to explicitly callSharedSessionContract.close() andEntityTransaction.commit().

Alternatively,getCurrentSession() provides support for the notion of contextually-scoped sessions, where an implementation of the SPI interfaceCurrentSessionContext is responsible for creating, scoping, and destroying sessions.

Depending on how Hibernate is configured, theSessionFactory itself might be responsible for the lifecycle of pooled JDBC connections and transactions, or it may simply act as a client for a connection pool or transaction manager provided by a container environment.

The internal state of aSessionFactory is considered in some sense "immutable". While it interacts with stateful services like JDBC connection pools, such state changes are never visible to its clients. In particular, the runtime metamodel representing the entities and their O/R mappings is fixed as soon as theSessionFactory is created. Of course, anySessionFactory is threadsafe.

There are some interesting exceptions to this principle:

TheSessionFactory exposes part of the information in the runtime metamodel via aninstance of the JPA-definedMetamodel. This object is sometimes used in a sophisticated way by libraries or frameworks to implement generic concerns involving entity classes.

When Hibernate Processor is used, elements of this metamodel may also be obtained in a typesafe way, via the generated metamodel classes. For an entity classBook, the generatedBook_ class has:

Use of these statically-typed metamodel references is the preferred way of working with thecriteria query API, and withEntityGraphs.

The factory alsoprovides aSchemaManager which allows, as a convenience for writing tests:

Finally, the factoryprovides aHibernateCriteriaBuilder, an extension to the JPA-defined interfaceCriteriaBuilder, which may be used to constructcriteria queries.

EverySessionFactory is a JPAEntityManagerFactory. Furthermore, when Hibernate is acting as the JPA persistence provider, the methodEntityManagerFactory.unwrap(Class) may be used to obtain the underlyingSessionFactory.

The very simplest way to obtain a newSessionFactory is using aConfiguration orHibernatePersistenceConfiguration.

See Also: