Example usage for org.hibernate.id IdentifierGeneratorHelper getIntegralDataTypeHolder

List of usage examples for org.hibernate.id IdentifierGeneratorHelper getIntegralDataTypeHolder

Introduction

In this page you can find the example usage for org.hibernate.id IdentifierGeneratorHelper getIntegralDataTypeHolder.

Prototype

public static IntegralDataTypeHolder getIntegralDataTypeHolder(Class integralType) 

Source Link

Usage

From source file:com.literatejava.hibernate.allocator.LinearBlockAllocator.java

License:Open Source License

public void configure(Type type, Properties params, Dialect dialect) {
    ObjectNameNormalizer normalizer = (ObjectNameNormalizer) params.get(IDENTIFIER_NORMALIZER);

    this.tableName = ConfigurationHelper.getString(ALLOC_TABLE, params, DEFAULT_TABLE);
    this.sequenceColumn = ConfigurationHelper.getString(SEQUENCE_COLUMN, params, DEFAULT_SEQUENCE_COLUMN);
    this.allocColumn = ConfigurationHelper.getString(ALLOC_COLUMN, params, DEFAULT_ALLOC_COLUMN);

    // get SequenceName;    default to Entities' TableName.
    //      -/*from w w w.j a v  a2s . c o  m*/
    this.sequenceName = ConfigurationHelper.getString(SEQUENCE_NAME, params,
            params.getProperty(PersistentIdentifierGenerator.TABLE));
    if (sequenceName == null) {
        throw new IdentifierGenerationException(
                "LinearBlockAllocator: '" + SEQUENCE_NAME + "' must be specified");
    }

    this.blockSize = ConfigurationHelper.getInt(BLOCK_SIZE, params, DEFAULT_BLOCK_SIZE);
    if (blockSize < 1) {
        blockSize = 1;
    }

    // qualify Table Name, if necessary;
    //      --
    if (tableName.indexOf('.') < 0) {
        String schemaName = normalizer.normalizeIdentifierQuoting(params.getProperty(SCHEMA));
        String catalogName = normalizer.normalizeIdentifierQuoting(params.getProperty(CATALOG));
        this.tableName = Table.qualify(catalogName, schemaName, tableName);
    }

    // build SQL strings;
    //      -- use appendLockHint(LockMode) for now, as that is how Hibernate's generators do it.
    //
    this.query = "select " + allocColumn + " from "
            + dialect.appendLockHint(LockMode.PESSIMISTIC_WRITE, tableName) + " where " + sequenceColumn
            + " = ?" + dialect.getForUpdateString();
    this.update = "update " + tableName + " set " + allocColumn + " = ? where " + sequenceColumn + " = ? and "
            + allocColumn + " = ?";

    // setup Return Type & Result Holder.
    //      --
    this.returnType = type;
    this.returnClass = type.getReturnedClass();
    this.resultFactory = IdentifierGeneratorHelper.getIntegralDataTypeHolder(returnClass);

    // done.
}

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 w w.  jav  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

private IntegralDataTypeHolder makeValue() {
    return IdentifierGeneratorHelper.getIntegralDataTypeHolder(identifierType.getReturnedClass());
}

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/*from w w w  .  j  a  va  2 s.  c  om*/
        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//  w w  w  .jav  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;
                }
            });
        }
    });
}