Example usage for org.hibernate.id IntegralDataTypeHolder bind

List of usage examples for org.hibernate.id IntegralDataTypeHolder bind

Introduction

In this page you can find the example usage for org.hibernate.id IntegralDataTypeHolder bind.

Prototype

public void bind(PreparedStatement preparedStatement, int position) throws SQLException;

Source Link

Document

Bind this holders internal value to the given result set.

Usage

From source file:de.innovationgate.webgate.api.mysql.GaleraClusterTableGenerator.java

License:Open Source License

@Override
public synchronized Serializable generate(final SessionImplementor session, Object obj) {
    final SqlStatementLogger statementLogger = session.getFactory().getServiceRegistry()
            .getService(JdbcServices.class).getSqlStatementLogger();
    return optimizer.generate(new AccessCallback() {
        @Override/*from w ww  .j av a 2 s  .  co m*/
        public IntegralDataTypeHolder getNextValue() {
            return session.getTransactionCoordinator().getTransaction().createIsolationDelegate()
                    .delegateWork(new AbstractReturningWork<IntegralDataTypeHolder>() {
                        @Override
                        public IntegralDataTypeHolder execute(Connection connection) throws SQLException {
                            IntegralDataTypeHolder value = IdentifierGeneratorHelper
                                    .getIntegralDataTypeHolder(identifierType.getReturnedClass());
                            int rows = 0;
                            do {
                                statementLogger.logStatement(selectQuery, FormatStyle.BASIC.getFormatter());
                                PreparedStatement selectPS = connection.prepareStatement(selectQuery);
                                try {
                                    selectPS.setString(1, segmentValue);
                                    ResultSet selectRS = selectPS.executeQuery();
                                    if (!selectRS.next()) {
                                        value.initialize(initialValue);
                                        PreparedStatement insertPS = null;
                                        try {
                                            statementLogger.logStatement(insertQuery,
                                                    FormatStyle.BASIC.getFormatter());
                                            insertPS = connection.prepareStatement(insertQuery);
                                            insertPS.setString(1, segmentValue);
                                            value.bind(insertPS, 2);
                                            insertPS.execute();
                                        } finally {
                                            if (insertPS != null) {
                                                insertPS.close();
                                            }
                                        }
                                    } else {
                                        value.initialize(selectRS, 1);
                                    }
                                    selectRS.close();
                                } catch (SQLException e) {
                                    LOG.unableToReadOrInitHiValue(e);
                                    throw e;
                                } finally {
                                    selectPS.close();
                                }

                                statementLogger.logStatement(updateQuery, FormatStyle.BASIC.getFormatter());
                                PreparedStatement updatePS = connection.prepareStatement(updateQuery);
                                try {
                                    final IntegralDataTypeHolder updateValue = value.copy();
                                    if (optimizer.applyIncrementSizeToSourceValues()) {
                                        updateValue.add(incrementSize);
                                    } else {
                                        updateValue.increment();
                                    }
                                    updateValue.bind(updatePS, 1);
                                    value.bind(updatePS, 2);
                                    updatePS.setString(3, segmentValue);
                                    rows = updatePS.executeUpdate();
                                } catch (SQLException e) {
                                    // Another cluster node concurrently fetched and changed the ID. Just retry. 
                                    if (e.getErrorCode() == 1213) {
                                    } else {
                                        LOG.unableToUpdateQueryHiValue(tableName, e);
                                        throw e;
                                    }
                                } finally {
                                    updatePS.close();
                                }
                            } while (rows == 0);

                            accessCount++;

                            return value;
                        }
                    }, true);
        }
    });
}

From source file:net.e6tech.elements.persist.hibernate.ModifiedTableGenerator.java

License:Apache License

@Override
public Serializable generate(final SharedSessionContractImplementor session, final Object obj) {
    final SqlStatementLogger statementLogger = session.getFactory().getServiceRegistry()
            .getService(JdbcServices.class).getSqlStatementLogger();
    final SessionEventListenerManager statsCollector = session.getEventListenerManager();

    return optimizer.generate(new AccessCallback() {
        @Override//from  ww  w . j ava2 s .c  om
        public IntegralDataTypeHolder getNextValue() {
            return session.getTransactionCoordinator().createIsolationDelegate()
                    .delegateWork(new AbstractReturningWork<IntegralDataTypeHolder>() {
                        @Override
                        public IntegralDataTypeHolder execute(Connection connection) throws SQLException {
                            final IntegralDataTypeHolder value = makeValue();
                            int rows;
                            do {
                                final PreparedStatement selectPS = prepareStatement(connection, selectQuery,
                                        statementLogger, statsCollector);

                                try {
                                    selectPS.setString(1, segmentValue);
                                    final ResultSet selectRS = executeQuery(selectPS, statsCollector);
                                    if (!selectRS.next()) {
                                        value.initialize(initialValue);

                                        final PreparedStatement insertPS = prepareStatement(connection,
                                                insertQuery, statementLogger, statsCollector);
                                        try {
                                            LOG.tracef("binding parameter [%s] - [%s]", 1, segmentValue);
                                            insertPS.setString(1, segmentValue);
                                            value.bind(insertPS, 2);
                                            executeUpdate(insertPS, statsCollector);
                                        } finally {
                                            insertPS.close();
                                        }
                                    } else {
                                        value.initialize(selectRS, 1);
                                    }
                                    selectRS.close();
                                } catch (SQLException e) {
                                    LOG.unableToReadOrInitHiValue(e);
                                    throw e;
                                } finally {
                                    selectPS.close();
                                }

                                final PreparedStatement updatePS = prepareStatement(connection, updateQuery,
                                        statementLogger, statsCollector);
                                try {
                                    final IntegralDataTypeHolder updateValue = value.copy();
                                    if (optimizer.applyIncrementSizeToSourceValues()) {
                                        updateValue.add(incrementSize);
                                    } else {
                                        updateValue.increment();
                                    }
                                    updateValue.bind(updatePS, 1);
                                    value.bind(updatePS, 2);
                                    updatePS.setString(3, segmentValue);
                                    rows = executeUpdate(updatePS, statsCollector);
                                } catch (SQLException e) {
                                    LOG.unableToUpdateQueryHiValue(renderedTableName, e);
                                    throw e;
                                } finally {
                                    updatePS.close();
                                }
                            } while (rows == 0);

                            accessCount++;

                            return value;
                        }
                    }, true);
        }

        @Override
        public String getTenantIdentifier() {
            return session.getTenantIdentifier();
        }
    });
}

From source file:org.apereo.portal.utils.HibernateStyleCounterStore.java

License:Apache License

private int getNextIdInternal(final Optimizer optimizer, final String counterName) {

    return (Integer) optimizer.generate(new AccessCallback() {
        @Override//  w  w  w .j a v a2 s  .  c o  m
        public IntegralDataTypeHolder getNextValue() {

            IntegralDataTypeHolder rslt = null;
            for (int i = 0; rslt == null && i < MAX_ATTEMPTS; i++) {

                rslt = transactionOperations.execute(new TransactionCallback<IntegralDataTypeHolder>() {
                    @Override
                    public IntegralDataTypeHolder doInTransaction(TransactionStatus status) {
                        final IntegralDataTypeHolder value = IdentifierGeneratorHelper
                                .getIntegralDataTypeHolder(identifierType.getReturnedClass());

                        //Try and load the current value, returns true if the expected row exists, null otherwise
                        final boolean selected = jdbcOperations.query(SELECT_QUERY,
                                new ResultSetExtractor<Boolean>() {
                                    @Override
                                    public Boolean extractData(ResultSet rs)
                                            throws SQLException, DataAccessException {
                                        if (rs.next()) {
                                            value.initialize(rs, 1);
                                            return true;
                                        }
                                        return false;
                                    }
                                }, counterName);

                        //No row exists for the counter, insert it
                        if (!selected) {
                            value.initialize(initialValue);

                            jdbcOperations.update(INSERT_QUERY, new PreparedStatementSetter() {
                                @Override
                                public void setValues(PreparedStatement ps) throws SQLException {
                                    ps.setString(1, counterName);
                                    value.bind(ps, 2);
                                }
                            });
                        }

                        //Increment the counter row value
                        final IntegralDataTypeHolder updateValue = value.copy();
                        if (optimizer.applyIncrementSizeToSourceValues()) {
                            updateValue.add(incrementSize);
                        } else {
                            updateValue.increment();
                        }

                        //Update the counter row, if rows returns 0 the update failed due to a race condition, it will be retried
                        int rowsAltered = jdbcOperations.update(UPDATE_QUERY, new PreparedStatementSetter() {
                            @Override
                            public void setValues(PreparedStatement ps) throws SQLException {
                                updateValue.bind(ps, 1);
                                ps.setString(2, counterName);
                                value.bind(ps, 3);
                            }
                        });

                        return rowsAltered > 0 ? value // Success
                                : null; // Failed;  try again...
                    }
                });
            } // End for loop

            if (rslt == null) {
                throw new RuntimeException(
                        "Failed to fetch a new batch of sequence values after " + MAX_ATTEMPTS + " tries");
            }

            return rslt;
        }
    });
}

From source file:org.jasig.portal.utils.HibernateStyleCounterStore.java

License:Apache License

private int getNextIdInternal(final Optimizer optimizer, final String counterName) {
    return (Integer) optimizer.generate(new AccessCallback() {
        @Override//from   w  ww .  j  av  a2  s  . c  o  m
        public IntegralDataTypeHolder getNextValue() {
            return transactionOperations.execute(new TransactionCallback<IntegralDataTypeHolder>() {
                @Override
                public IntegralDataTypeHolder doInTransaction(TransactionStatus status) {
                    final IntegralDataTypeHolder value = IdentifierGeneratorHelper
                            .getIntegralDataTypeHolder(identifierType.getReturnedClass());
                    int rows;
                    do {
                        //Try and load the current value, returns true if the exepected row exists, null otherwise
                        final boolean selected = jdbcOperations.query(SELECT_QUERY,
                                new ResultSetExtractor<Boolean>() {
                                    @Override
                                    public Boolean extractData(ResultSet rs)
                                            throws SQLException, DataAccessException {
                                        if (rs.next()) {
                                            value.initialize(rs, 1);
                                            return true;
                                        }
                                        return false;
                                    }
                                }, counterName);

                        //No row exists for the counter, insert it
                        if (!selected) {
                            value.initialize(initialValue);

                            jdbcOperations.update(INSERT_QUERY, new PreparedStatementSetter() {
                                @Override
                                public void setValues(PreparedStatement ps) throws SQLException {
                                    ps.setString(1, counterName);
                                    value.bind(ps, 2);
                                }
                            });
                        }

                        //Increment the counter row value
                        final IntegralDataTypeHolder updateValue = value.copy();
                        if (optimizer.applyIncrementSizeToSourceValues()) {
                            updateValue.add(incrementSize);
                        } else {
                            updateValue.increment();
                        }

                        //Update the counter row, if rows returns 0 the update failed due to a race condition, it will be retried
                        rows = jdbcOperations.update(UPDATE_QUERY, new PreparedStatementSetter() {
                            @Override
                            public void setValues(PreparedStatement ps) throws SQLException {
                                updateValue.bind(ps, 1);
                                ps.setString(2, counterName);
                                value.bind(ps, 3);
                            }
                        });
                    } while (rows == 0);

                    return value;
                }
            });
        }
    });
}