public class HibernateJpaDialect extends DefaultJpaDialect
JpaDialect implementation for
Hibernate EntityManager. Developed against Hibernate 5.0/5.1/5.2.HibernateJpaVendorAdapter,
Session.setFlushMode(org.hibernate.FlushMode),
Transaction.setTimeout(int),
Serialized Form| Constructor and Description |
|---|
HibernateJpaDialect() |
| Modifier and Type | Method and Description |
|---|---|
java.lang.Object |
beginTransaction(EntityManager entityManager,
TransactionDefinition definition)
This implementation invokes the standard JPA
Transaction.begin
method. |
void |
cleanupTransaction(java.lang.Object transactionData)
This implementation does nothing, since the default
beginTransaction
implementation does not require any cleanup. |
protected DataAccessException |
convertHibernateAccessException(HibernateException ex)
Convert the given HibernateException to an appropriate exception
from the
org.springframework.dao hierarchy. |
ConnectionHandle |
getJdbcConnection(EntityManager entityManager,
boolean readOnly)
This implementation always returns
null,
indicating that no JDBC Connection can be provided. |
protected Session |
getSession(EntityManager entityManager) |
protected FlushMode |
prepareFlushMode(Session session,
boolean readOnly) |
java.lang.Object |
prepareTransaction(EntityManager entityManager,
boolean readOnly,
java.lang.String name)
Prepare a JPA transaction, applying the specified semantics.
|
void |
setPrepareConnection(boolean prepareConnection)
Set whether to prepare the underlying JDBC Connection of a transactional
Hibernate Session, that is, whether to apply a transaction-specific
isolation level and/or the transaction's read-only flag to the underlying
JDBC Connection.
|
DataAccessException |
translateExceptionIfPossible(java.lang.RuntimeException ex)
This implementation delegates to EntityManagerFactoryUtils.
|
releaseJdbcConnectionpublic void setPrepareConnection(boolean prepareConnection)
Default is "true" on Hibernate EntityManager 4.x (with its 'on-close' connection release mode.
If you turn this flag off, JPA transaction management will not support
per-transaction isolation levels anymore. It will not call
Connection.setReadOnly(true) for read-only transactions anymore either.
If this flag is turned off, no cleanup of a JDBC Connection is required after
a transaction, since no Connection settings will get modified.
NOTE: The default behavior in terms of read-only handling changed in Spring 4.1, propagating the read-only status to the JDBC Connection now, analogous to other Spring transaction managers. This may have the effect that you're running into read-only enforcement now where previously write access has accidentally been tolerated: Please revise your transaction declarations accordingly, removing invalid read-only markers if necessary.
Connection.setTransactionIsolation(int),
Connection.setReadOnly(boolean)public java.lang.Object beginTransaction(EntityManager entityManager, TransactionDefinition definition) throws PersistenceException, java.sql.SQLException, TransactionException
DefaultJpaDialectTransaction.begin
method. Throws an InvalidIsolationLevelException if a non-default isolation
level is set.
This implementation does not return any transaction data Object, since there
is no state to be kept for a standard JPA transaction. Hence, subclasses do not
have to care about the return value (null) of this implementation
and are free to return their own transaction data Object.
beginTransaction in interface JpaDialectbeginTransaction in class DefaultJpaDialectentityManager - the EntityManager to begin a JPA transaction ondefinition - the Spring transaction definition that defines semanticsJpaDialect.cleanupTransaction(java.lang.Object)). May implement the
SavepointManager interface.PersistenceException - if thrown by JPA methodsjava.sql.SQLException - if thrown by JDBC methodsTransactionException - in case of invalid argumentsEntityTransaction.begin(),
InvalidIsolationLevelException,
DefaultJpaDialect.cleanupTransaction(java.lang.Object)public java.lang.Object prepareTransaction(EntityManager entityManager, boolean readOnly, @Nullable java.lang.String name) throws PersistenceException
JpaDialectAn implementation can apply the read-only flag as flush mode. In that case,
a transaction data object can be returned that holds the previous flush mode
(and possibly other data), to be reset in cleanupTransaction.
Implementations can also use the Spring transaction name to optimize for specific data access use cases (effectively using the current transaction name as use case identifier).
prepareTransaction in interface JpaDialectprepareTransaction in class DefaultJpaDialectentityManager - the EntityManager to begin a JPA transaction onreadOnly - whether the transaction is supposed to be read-onlyname - the name of the transaction (if any)PersistenceException - if thrown by JPA methodsJpaDialect.cleanupTransaction(java.lang.Object)@Nullable protected FlushMode prepareFlushMode(Session session, boolean readOnly) throws PersistenceException
PersistenceExceptionpublic void cleanupTransaction(@Nullable java.lang.Object transactionData)
DefaultJpaDialectbeginTransaction
implementation does not require any cleanup.cleanupTransaction in interface JpaDialectcleanupTransaction in class DefaultJpaDialecttransactionData - arbitrary object that holds transaction data, if any
(as returned by beginTransaction or prepareTransaction)DefaultJpaDialect.beginTransaction(javax.persistence.EntityManager, org.springframework.transaction.TransactionDefinition)public ConnectionHandle getJdbcConnection(EntityManager entityManager, boolean readOnly) throws PersistenceException, java.sql.SQLException
DefaultJpaDialectnull,
indicating that no JDBC Connection can be provided.getJdbcConnection in interface JpaDialectgetJdbcConnection in class DefaultJpaDialectentityManager - the current JPA EntityManagerreadOnly - whether the Connection is only needed for read-only purposesreleaseJdbcConnection,
or null if no JDBC Connection can be retrievedPersistenceException - if thrown by JPA methodsjava.sql.SQLException - if thrown by JDBC methodsJpaDialect.releaseJdbcConnection(org.springframework.jdbc.datasource.ConnectionHandle, javax.persistence.EntityManager),
ConnectionHandle.getConnection(),
SimpleConnectionHandle,
JpaTransactionManager.setDataSource(javax.sql.DataSource)@Nullable public DataAccessException translateExceptionIfPossible(java.lang.RuntimeException ex)
DefaultJpaDialecttranslateExceptionIfPossible in interface PersistenceExceptionTranslatortranslateExceptionIfPossible in class DefaultJpaDialectex - a RuntimeException to translatenull if the
exception could not be translated, as in this case it may result from
user code rather than from an actual persistence problem)EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(java.lang.RuntimeException)protected DataAccessException convertHibernateAccessException(HibernateException ex)
org.springframework.dao hierarchy.ex - HibernateException that occurredprotected Session getSession(EntityManager entityManager)