/* * 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.id; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.dialect.DB2Dialect; import org.hibernate.dialect.DerbyDialect; import org.hibernate.dialect.Dialect; import org.hibernate.dialect.HSQLDialect; import org.hibernate.dialect.Oracle8iDialect; import org.hibernate.dialect.SQLServer2012Dialect; import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.exception.GenericJDBCException; import org.hibernate.jdbc.Work; /** * @author Andrea Boriero */ public class SequenceValueExtractor { private final Dialect dialect; private final String queryString; public SequenceValueExtractor(Dialect dialect, String sequenceName) { this.dialect = dialect; if ( dialect instanceof DerbyDialect ) { queryString = "VALUES SYSCS_UTIL.SYSCS_PEEK_AT_SEQUENCE('HIBERNATE_ORM_TEST', '" + sequenceName.toUpperCase() + "')"; } else if ( dialect instanceof DB2Dialect ) { queryString = "values PREVIOUS value for " + sequenceName; } else if ( dialect instanceof Oracle8iDialect ) { queryString = "select " + sequenceName + ".currval from dual"; } else if ( dialect instanceof SQLServer2012Dialect ) { queryString = "SELECT CONVERT(varchar(200), Current_value) FROM sys.sequences WHERE name = '" + sequenceName + "'"; } else if ( dialect instanceof HSQLDialect ) { queryString = "call current value for " + sequenceName; } else { queryString = "select currval('" + sequenceName + "');"; } } public long extractSequenceValue(final SessionImplementor sessionImpl) { class WorkImpl implements Work { private long value; public void execute(Connection connection) throws SQLException { Session session = (Session) sessionImpl; Transaction transaction = session.beginTransaction(); try { final PreparedStatement query = sessionImpl.getJdbcCoordinator() .getStatementPreparer() .prepareStatement( queryString ); ResultSet resultSet = sessionImpl.getJdbcCoordinator().getResultSetReturn().extract( query ); resultSet.next(); value = resultSet.getLong( 1 ); resultSet.close(); transaction.commit(); }catch (GenericJDBCException e){ transaction.rollback(); throw e; } if ( dialect instanceof DerbyDialect ) { value--; } } } WorkImpl work = new WorkImpl(); ((Session) sessionImpl).doWork( work ); return work.value; } }