Example usage for org.hibernate.jdbc AbstractReturningWork AbstractReturningWork

List of usage examples for org.hibernate.jdbc AbstractReturningWork AbstractReturningWork

Introduction

In this page you can find the example usage for org.hibernate.jdbc AbstractReturningWork AbstractReturningWork.

Prototype

AbstractReturningWork

Source Link

Usage

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

License:Open Source License

protected long allocateBlock(final SessionImplementor session) {
    AbstractReturningWork<Long> work = new AbstractReturningWork<Long>() {
        @Override//from   w ww.j a  v  a 2s.  c o  m
        public Long execute(Connection conn) throws SQLException {
            final SqlStatementLogger statementLogger = session.getFactory().getServiceRegistry()
                    .getService(JdbcServices.class).getSqlStatementLogger();

            long result;
            int rows;
            do {
                // The loop ensures atomicity of the
                // select + update even for no transaction
                // or read committed isolation level

                statementLogger.logStatement(query, FormatStyle.BASIC.getFormatter());
                PreparedStatement qps = conn.prepareStatement(query);
                try {
                    qps.setString(1, sequenceName);
                    ResultSet rs = qps.executeQuery();
                    if (!rs.next()) {
                        String err = "could not read a hi value - you need to populate the table: " + tableName
                                + ", " + sequenceName;
                        log.error(err);
                        throw new IdentifierGenerationException(err);
                    }
                    result = rs.getLong(1);
                    rs.close();
                } catch (SQLException sqle) {
                    log.error("could not read a hi value", sqle);
                    throw sqle;
                } finally {
                    qps.close();
                }

                statementLogger.logStatement(update, FormatStyle.BASIC.getFormatter());
                PreparedStatement ups = conn.prepareStatement(update);
                try {
                    ups.setLong(1, result + blockSize);
                    ups.setString(2, sequenceName);
                    ups.setLong(3, result);
                    rows = ups.executeUpdate();
                } catch (SQLException sqle) {
                    log.error("could not update hi value in: " + tableName, sqle);
                    throw sqle;
                } finally {
                    ups.close();
                }
            } while (rows == 0);

            // success;
            //      -- allocated a Block.
            //
            statisticsTableAccessCount++;
            return new Long(result);
        }
    };

    // perform in an isolated Transaction.
    long allocated = session.getTransactionCoordinator().getTransaction().createIsolationDelegate()
            .delegateWork(work, true);
    return allocated;
}

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/* w  w w .  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  w  ww  .jav a  2s  .  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.openremote.manager.asset.AssetStorageService.java

License:Open Source License

protected List<Asset> findAll(EntityManager em, BaseAssetQuery query) {

    // Use a default projection if it's missing
    if (query.select == null)
        query.select = new Select();
    if (query.select.include == null)
        query.select.include = ALL_EXCEPT_PATH_AND_ATTRIBUTES;
    if (query.select.access == null)
        query.select.access = PRIVATE_READ;

    // Default to order by creation date if the query may return multiple results
    if (query.orderBy == null && query.ids == null)
        query.orderBy = new OrderBy(OrderBy.Property.CREATED_ON);

    PreparedAssetQuery querySql = buildQuery(query);

    return em.unwrap(Session.class).doReturningWork(new AbstractReturningWork<List<Asset>>() {
        @Override/*www.  ja va2s  . c o  m*/
        public List<Asset> execute(Connection connection) throws SQLException {
            LOG.fine("Executing: " + querySql.querySql);
            try (PreparedStatement st = connection.prepareStatement(querySql.querySql)) {
                querySql.apply(st);

                try (ResultSet rs = st.executeQuery()) {
                    List<Asset> result = new ArrayList<>();
                    if (query.calendarEventActive != null) {
                        while (rs.next()) {
                            Asset asset = mapResultTuple(query, rs);
                            if (calendarEventPredicateMatches(query.calendarEventActive, asset)) {
                                result.add(asset);
                            }
                        }
                    } else {
                        while (rs.next()) {
                            result.add(mapResultTuple(query, rs));
                        }
                    }
                    return result;
                }
            }
        }
    });
}

From source file:org.openremote.manager.server.asset.AssetStorageService.java

License:Open Source License

protected List<ServerAsset> findAll(EntityManager em, AssetQuery query) {
    StringBuilder sb = new StringBuilder();
    sb.append(buildSelectString(query, false));
    sb.append(buildFromString(query));//from   w  w w. java  2  s  . com
    Pair<String, List<ParameterBinder>> whereClause = buildWhereClause(query);
    sb.append(whereClause.key);
    sb.append(buildOrderByString(query));
    return em.unwrap(Session.class).doReturningWork(new AbstractReturningWork<List<ServerAsset>>() {
        @Override
        public List<ServerAsset> execute(Connection connection) throws SQLException {
            PreparedStatement st = connection.prepareStatement(sb.toString());
            for (ParameterBinder binder : whereClause.value) {
                binder.accept(st);
            }
            try (ResultSet rs = st.executeQuery()) {
                List<ServerAsset> result = new ArrayList<>();
                while (rs.next()) {
                    result.add(mapResultTuple(query, rs));
                }
                return result;
            }
        }
    });
}

From source file:org.openremote.manager.server.asset.AssetStorageService.java

License:Open Source License

protected List<String> findAllIdentifiersOnly(EntityManager em, AssetQuery query) {
    StringBuilder sb = new StringBuilder();
    sb.append(buildSelectString(query, true));
    sb.append(buildFromString(query));/* w  ww .ja va  2  s .  co  m*/
    Pair<String, List<ParameterBinder>> whereClause = buildWhereClause(query);
    sb.append(whereClause.key);
    sb.append(buildOrderByString(query));
    return em.unwrap(Session.class).doReturningWork(new AbstractReturningWork<List<String>>() {
        @Override
        public List<String> execute(Connection connection) throws SQLException {
            PreparedStatement st = connection.prepareStatement(sb.toString());
            for (ParameterBinder binder : whereClause.value) {
                binder.accept(st);
            }
            try (ResultSet rs = st.executeQuery()) {
                List<String> result = new ArrayList<>();
                while (rs.next()) {
                    result.add(rs.getString("ID"));
                }
                return result;
            }
        }
    });
}