/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
 * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
 */
package org.hibernate.resource.jdbc.spi;

import java.util.Locale;

import org.hibernate.ConnectionAcquisitionMode;
import org.hibernate.ConnectionReleaseMode;
import org.hibernate.internal.util.StringHelper;

import static org.hibernate.ConnectionAcquisitionMode.AS_NEEDED;
import static org.hibernate.ConnectionAcquisitionMode.IMMEDIATELY;
import static org.hibernate.ConnectionReleaseMode.AFTER_STATEMENT;
import static org.hibernate.ConnectionReleaseMode.AFTER_TRANSACTION;
import static org.hibernate.ConnectionReleaseMode.ON_CLOSE;

Represents valid combinations of ConnectionAcquisitionMode and ConnectionReleaseMode
Author:Steve Ebersole
/** * Represents valid combinations of ConnectionAcquisitionMode and ConnectionReleaseMode * * @author Steve Ebersole */
public enum PhysicalConnectionHandlingMode {
The Connection will be acquired as soon as the Session is opened and held until the Session is closed. This is the only valid combination including immediate acquisition of the Connection
/** * The Connection will be acquired as soon as the Session is opened and * held until the Session is closed. This is the only valid combination * including immediate acquisition of the Connection */
IMMEDIATE_ACQUISITION_AND_HOLD( IMMEDIATELY, ON_CLOSE ),
The Connection will be acquired as soon as it is needed and then held until the Session is closed. This is the original Hibernate behavior.
/** * The Connection will be acquired as soon as it is needed and then held * until the Session is closed. This is the original Hibernate behavior. */
DELAYED_ACQUISITION_AND_HOLD( AS_NEEDED, ON_CLOSE ),
The Connection will be acquired as soon as it is needed; it will be released after each statement is executed.
/** * The Connection will be acquired as soon as it is needed; it will be released * after each statement is executed. */
DELAYED_ACQUISITION_AND_RELEASE_AFTER_STATEMENT( AS_NEEDED, AFTER_STATEMENT ),
The Connection will be acquired as soon as it is needed; it will be released after each transaction is completed.
/** * The Connection will be acquired as soon as it is needed; it will be released * after each transaction is completed. */
DELAYED_ACQUISITION_AND_RELEASE_AFTER_TRANSACTION( AS_NEEDED, AFTER_TRANSACTION ) ; private final ConnectionAcquisitionMode acquisitionMode; private final ConnectionReleaseMode releaseMode; PhysicalConnectionHandlingMode( ConnectionAcquisitionMode acquisitionMode, ConnectionReleaseMode releaseMode) { this.acquisitionMode = acquisitionMode; this.releaseMode = releaseMode; } public ConnectionAcquisitionMode getAcquisitionMode() { return acquisitionMode; } public ConnectionReleaseMode getReleaseMode() { return releaseMode; } public static PhysicalConnectionHandlingMode interpret(Object setting) { if ( setting == null ) { return null; } if ( setting instanceof PhysicalConnectionHandlingMode ) { return (PhysicalConnectionHandlingMode) setting; } final String value = setting.toString(); if ( StringHelper.isEmpty( value ) ) { return null; } return PhysicalConnectionHandlingMode.valueOf( value.toUpperCase( Locale.ROOT ) ); } public static PhysicalConnectionHandlingMode interpret( ConnectionAcquisitionMode acquisitionMode, ConnectionReleaseMode releaseMode) { if ( acquisitionMode == IMMEDIATELY ) { if ( releaseMode != null && releaseMode != ON_CLOSE ) { throw new IllegalArgumentException( "Only ConnectionReleaseMode.ON_CLOSE can be used in combination with " + "ConnectionAcquisitionMode.IMMEDIATELY; but ConnectionReleaseMode." + releaseMode.name() + " was specified." ); } return IMMEDIATE_ACQUISITION_AND_HOLD; } else { switch ( releaseMode ) { case AFTER_STATEMENT: { return DELAYED_ACQUISITION_AND_RELEASE_AFTER_STATEMENT; } case AFTER_TRANSACTION: { return DELAYED_ACQUISITION_AND_RELEASE_AFTER_TRANSACTION; } default: { return DELAYED_ACQUISITION_AND_HOLD; } } } } }