Class DefaultJpaDialect

java.lang.Object
org.springframework.orm.jpa.DefaultJpaDialect
All Implemented Interfaces:
Serializable, PersistenceExceptionTranslator, JpaDialect
Direct Known Subclasses:
EclipseLinkJpaDialect, HibernateJpaDialect

public class DefaultJpaDialect extends Object implements JpaDialect, Serializable
Default implementation of the JpaDialect interface. Used as default dialect by JpaTransactionManager.

Simply begins a standard JPA transaction in beginTransaction(EntityManager, TransactionDefinition) and performs standard exception translation through EntityManagerFactoryUtils.

Since:
2.0
Author:
Juergen Hoeller
See Also:
  • Constructor Details

    • DefaultJpaDialect

      public DefaultJpaDialect()
  • Method Details

    • beginTransaction

      public @Nullable Object beginTransaction(jakarta.persistence.EntityManager entityManager, TransactionDefinition definition) throws jakarta.persistence.PersistenceException, SQLException, TransactionException
      This implementation invokes the standard JPA Transaction.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.

      Specified by:
      beginTransaction in interface JpaDialect
      Parameters:
      entityManager - the EntityManager to begin a JPA transaction on
      definition - the Spring transaction definition that defines semantics
      Returns:
      an arbitrary object that holds transaction data, if any (to be passed into JpaDialect.cleanupTransaction(Object)). May implement the SavepointManager interface.
      Throws:
      jakarta.persistence.PersistenceException - if thrown by JPA methods
      SQLException - if thrown by JDBC methods
      TransactionException - in case of invalid arguments
      See Also:
    • prepareTransaction

      public @Nullable Object prepareTransaction(jakarta.persistence.EntityManager entityManager, boolean readOnly, @Nullable String name) throws jakarta.persistence.PersistenceException
      Description copied from interface: JpaDialect
      Prepare a JPA transaction, applying the specified semantics. Called by EntityManagerFactoryUtils when enlisting an EntityManager in a JTA transaction or a locally joined transaction (for example, after upgrading an unsynchronized EntityManager to a synchronized one).

      An 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).

      Specified by:
      prepareTransaction in interface JpaDialect
      Parameters:
      entityManager - the EntityManager to begin a JPA transaction on
      readOnly - whether the transaction is supposed to be read-only
      name - the name of the transaction (if any)
      Returns:
      an arbitrary object that holds transaction data, if any (to be passed into cleanupTransaction)
      Throws:
      jakarta.persistence.PersistenceException - if thrown by JPA methods
      See Also:
    • cleanupTransaction

      public void cleanupTransaction(@Nullable Object transactionData)
      This implementation does nothing, since the default beginTransaction implementation does not require any cleanup.
      Specified by:
      cleanupTransaction in interface JpaDialect
      Parameters:
      transactionData - arbitrary object that holds transaction data, if any (as returned by beginTransaction or prepareTransaction)
      See Also:
    • getJdbcConnection

      public @Nullable ConnectionHandle getJdbcConnection(jakarta.persistence.EntityManager entityManager, boolean readOnly) throws jakarta.persistence.PersistenceException, SQLException
      This implementation always returns null, indicating that no JDBC Connection can be provided.
      Specified by:
      getJdbcConnection in interface JpaDialect
      Parameters:
      entityManager - the current JPA EntityManager
      readOnly - whether the Connection is only needed for read-only purposes
      Returns:
      a handle for the Connection, to be passed into releaseJdbcConnection, or null if no JDBC Connection can be retrieved
      Throws:
      jakarta.persistence.PersistenceException - if thrown by JPA methods
      SQLException - if thrown by JDBC methods
      See Also:
    • releaseJdbcConnection

      public void releaseJdbcConnection(ConnectionHandle conHandle, jakarta.persistence.EntityManager em) throws jakarta.persistence.PersistenceException, SQLException
      This implementation does nothing, assuming that the Connection will implicitly be closed with the EntityManager.

      If the JPA implementation returns a Connection handle that it expects the application to close after use, the dialect implementation needs to invoke Connection.close() (or some other method with similar effect) here.

      Specified by:
      releaseJdbcConnection in interface JpaDialect
      Parameters:
      conHandle - the JDBC Connection handle to release
      em - the current JPA EntityManager
      Throws:
      jakarta.persistence.PersistenceException - if thrown by JPA methods
      SQLException - if thrown by JDBC methods
      See Also:
    • translateExceptionIfPossible

      public @Nullable DataAccessException translateExceptionIfPossible(RuntimeException ex)
      This implementation delegates to EntityManagerFactoryUtils.
      Specified by:
      translateExceptionIfPossible in interface PersistenceExceptionTranslator
      Parameters:
      ex - a RuntimeException to translate
      Returns:
      the corresponding DataAccessException (or null if the exception could not be translated, as in this case it may result from user code rather than from an actual persistence problem)
      See Also: