Example usage for org.hibernate.internal.util.collections ArrayHelper countTrue

List of usage examples for org.hibernate.internal.util.collections ArrayHelper countTrue

Introduction

In this page you can find the example usage for org.hibernate.internal.util.collections ArrayHelper countTrue.

Prototype

public static int countTrue(boolean... array) 

Source Link

Usage

From source file:org.babyfish.hibernate.persister.UncompletedInitializedProperties.java

License:Open Source License

static void update(EntityPersisterBridge entityPersisterBridge, Object[] state, Object entity, Serializable id,
        Object rowId, SessionImplementor session) {
    FieldInterceptor fieldInterceptor = FieldInterceptionHelper.extractFieldInterceptor(entity);
    if (!(fieldInterceptor instanceof HibernateObjectModelScalarLoader)) {
        return;//  w w  w  .  j  a  v a 2 s.co m
    }
    HibernateObjectModelScalarLoader hibernateObjectModelScalarLoader = (HibernateObjectModelScalarLoader) fieldInterceptor;
    if (!hibernateObjectModelScalarLoader.isIncompletelyInitialized()) {
        return;
    }
    ObjectModel objectModel = hibernateObjectModelScalarLoader.getObjectModel();
    JPAObjectModelMetadata objectModelMetadata = objectModel.getObjectModelMetadata();
    EntityPersister entityPersister = entityPersisterBridge.getEntityPersister();
    String[] names = entityPersister.getPropertyNames();
    Type[] types = entityPersister.getPropertyTypes();
    boolean[] updateabilities = entityPersister.getPropertyUpdateability();

    List<Integer> updatePropertyIndexList = new ArrayList<>();
    for (int propertyIndex = 0; propertyIndex < names.length; propertyIndex++) {
        if (updateabilities[propertyIndex]) {
            Property property = objectModelMetadata.getMappingSources().get(names[propertyIndex]);
            if (property instanceof ScalarProperty) {
                ScalarProperty scalarProperty = (ScalarProperty) property;
                if (scalarProperty.isDeferrable()) {
                    int propertyId = scalarProperty.getId();
                    if (!objectModel.isDisabled(propertyId) && !objectModel.isUnloaded(propertyId)) {
                        updatePropertyIndexList.add(propertyIndex);
                    }
                }
            }
        }
    }
    if (updatePropertyIndexList.isEmpty()) {
        return;
    }
    int[] updatePropertyIndexes = new int[updatePropertyIndexList.size()];
    for (int i = updatePropertyIndexList.size() - 1; i >= 0; i--) {
        updatePropertyIndexes[i] = updatePropertyIndexList.get(i);
    }

    boolean[] tableUpdateNeeded = entityPersisterBridge.getTableUpdateNeeded(updatePropertyIndexes);
    boolean[][] propertyColumnUpdateable = entityPersisterBridge.getPropertyColumnUpdateable();
    for (int tableIndex = 0; tableIndex < entityPersisterBridge.getTableSpan(); tableIndex++) {
        if (tableUpdateNeeded[tableIndex]) {
            StringBuilder builder = new StringBuilder();
            builder.append("update ").append(entityPersisterBridge.getTableName(tableIndex)).append(" set ");
            boolean addComma = false;
            for (int propertyIndex : updatePropertyIndexes) {
                if (entityPersisterBridge.isPropertyOfTable(propertyIndex, tableIndex)) {
                    String[] columnNames = entityPersisterBridge.getPropertyColumnNames(propertyIndex);
                    for (int columnIndex = 0; columnIndex < columnNames.length; columnIndex++) {
                        if (propertyColumnUpdateable[propertyIndex][columnIndex]) {
                            if (addComma) {
                                builder.append(", ");
                            } else {
                                addComma = true;
                            }
                            builder.append(columnNames[columnIndex]).append(" = ?");
                        }
                    }
                }
            }
            if (!addComma) {
                continue;
            }
            builder.append(" where ");
            addComma = false;
            if (tableIndex == 0 && rowId != null) {
                builder.append(entityPersisterBridge.getRowIdName()).append(" = ?");
            } else {
                for (String keyColumn : entityPersisterBridge.getKeyColumns(tableIndex)) {
                    if (addComma) {
                        builder.append(", ");
                    } else {
                        addComma = true;
                    }
                    builder.append(keyColumn).append(" = ?");
                }
            }
            String sql = builder.toString();
            JdbcCoordinator jdbcCoordinator = session.getTransactionCoordinator().getJdbcCoordinator();
            PreparedStatement preparedStatement = jdbcCoordinator.getStatementPreparer().prepareStatement(sql);
            try {
                int paramIndex = 1;
                for (int propertyIndex : updatePropertyIndexes) {
                    if (entityPersisterBridge.isPropertyOfTable(propertyIndex, tableIndex)) {
                        types[propertyIndex].nullSafeSet(preparedStatement, state[propertyIndex], paramIndex,
                                propertyColumnUpdateable[propertyIndex], session);
                        paramIndex += ArrayHelper.countTrue(propertyColumnUpdateable[propertyIndex]);
                    }
                }
                if (tableIndex == 0 && rowId != null) {
                    preparedStatement.setObject(paramIndex, rowId);
                } else {
                    entityPersister.getIdentifierType().nullSafeSet(preparedStatement,
                            id != null ? id
                                    : objectModel.getScalar(objectModelMetadata.getEntityIdProperty().getId()),
                            paramIndex, session);
                }
                preparedStatement.executeUpdate();
            } catch (SQLException ex) {
                throw new HibernateException(ex);
            } finally {
                jdbcCoordinator.release(preparedStatement);
            }
        }
    }
}