FileDocCategorySizeDatePackage
AbstractSelectingDelegate.javaAPI DocHibernate 3.2.53343Fri Mar 24 11:10:04 GMT 2006org.hibernate.id.insert

AbstractSelectingDelegate

public abstract class AbstractSelectingDelegate extends Object implements InsertGeneratedIdentifierDelegate
Abstract InsertGeneratedIdentifierDelegate implementation where the underlying strategy requires an subsequent select after the insert to determine the generated identifier.
author
Steve Ebersole

Fields Summary
private final org.hibernate.id.PostInsertIdentityPersister
persister
Constructors Summary
protected AbstractSelectingDelegate(org.hibernate.id.PostInsertIdentityPersister persister)

		this.persister = persister;
	
Methods Summary
protected voidbindParameters(org.hibernate.engine.SessionImplementor session, java.sql.PreparedStatement ps, java.lang.Object entity)
Bind any required parameter values into the SQL command {@link #getSelectSQL}.

param
session The session
param
ps The prepared {@link #getSelectSQL SQL} command
param
entity The entity being saved.
throws
SQLException

	
protected abstract java.io.SerializablegetResult(org.hibernate.engine.SessionImplementor session, java.sql.ResultSet rs, java.lang.Object entity)
Extract the generated key value from the given result set.

param
session The session
param
rs The result set containing the generated primay key values.
param
entity The entity being saved.
return
The generated identifier
throws
SQLException

protected abstract java.lang.StringgetSelectSQL()
Get the SQL statement to be used to retrieve generated key values.

return
The SQL command string

public final java.io.SerializableperformInsert(java.lang.String insertSQL, org.hibernate.engine.SessionImplementor session, Binder binder)

		try {
			// prepare and execute the insert
			PreparedStatement insert = session.getBatcher().prepareStatement( insertSQL, false );
			try {
				binder.bindValues( insert );
				insert.executeUpdate();
			}
			finally {
				session.getBatcher().closeStatement( insert );
			}
		}
		catch ( SQLException sqle ) {
			throw JDBCExceptionHelper.convert(
					session.getFactory().getSQLExceptionConverter(),
			        sqle,
			        "could not insert: " + MessageHelper.infoString( persister ),
			        insertSQL
				);
		}

		final String selectSQL = getSelectSQL();

		try {
			//fetch the generated id in a separate query
			PreparedStatement idSelect = session.getBatcher().prepareStatement( selectSQL );
			try {
				bindParameters( session, idSelect, binder.getEntity() );
				ResultSet rs = idSelect.executeQuery();
				try {
					return getResult( session, rs, binder.getEntity() );
				}
				finally {
					rs.close();
				}
			}
			finally {
				session.getBatcher().closeStatement( idSelect );
			}

		}
		catch ( SQLException sqle ) {
			throw JDBCExceptionHelper.convert(
					session.getFactory().getSQLExceptionConverter(),
			        sqle,
			        "could not retrieve generated id after insert: " + MessageHelper.infoString( persister ),
			        insertSQL
			);
		}