All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.hibernate.metamodel.model.convert.internal.OrdinalEnumValueConverter Maven / Gradle / Ivy

There is a newer version: 7.0.0.Beta1
Show newest version
/*
 * 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.metamodel.model.convert.internal;

import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;

import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.metamodel.model.convert.spi.EnumValueConverter;
import org.hibernate.metamodel.model.creation.spi.RuntimeModelCreationContext;
import org.hibernate.type.descriptor.java.spi.EnumJavaDescriptor;
import org.hibernate.type.descriptor.java.spi.BasicJavaDescriptor;
import org.hibernate.type.spi.TypeConfiguration;

import org.jboss.logging.Logger;

/**
 * BasicValueConverter handling the conversion of an enum based on
 * JPA {@link javax.persistence.EnumType#ORDINAL} strategy (storing the ordinal)
 *
 * @author Steve Ebersole
 */
public class OrdinalEnumValueConverter implements EnumValueConverter, Serializable {
	private static final Logger log = Logger.getLogger( OrdinalEnumValueConverter.class );

	private final EnumJavaDescriptor enumJavaDescriptor;
	private final BasicJavaDescriptor relationalJavaDescriptor;

	public OrdinalEnumValueConverter(
			EnumJavaDescriptor enumJavaDescriptor,
			RuntimeModelCreationContext creationContext) {
		this(
				enumJavaDescriptor,
				creationContext.getTypeConfiguration()
						.getSqlTypeDescriptorRegistry()
						.getDescriptor( Types.INTEGER )
						.getJdbcRecommendedJavaTypeMapping( creationContext.getTypeConfiguration() )
		);
	}

	public OrdinalEnumValueConverter(EnumJavaDescriptor enumJavaDescriptor, TypeConfiguration typeConfiguration) {
		this(
				enumJavaDescriptor,
				typeConfiguration.getSqlTypeDescriptorRegistry()
						.getDescriptor( Types.INTEGER )
						.getJdbcRecommendedJavaTypeMapping( typeConfiguration )
		);
	}

	public OrdinalEnumValueConverter(
			EnumJavaDescriptor enumJavaDescriptor,
			BasicJavaDescriptor relationalJavaDescriptor) {
		this.enumJavaDescriptor = enumJavaDescriptor;
		this.relationalJavaDescriptor = relationalJavaDescriptor;
	}

	@Override
	public E toDomainValue(Integer relationalForm, SharedSessionContractImplementor session) {
		return enumJavaDescriptor.fromOrdinal( relationalForm );
	}

	@Override
	public Integer toRelationalValue(E domainForm, SharedSessionContractImplementor session) {
		return enumJavaDescriptor.toOrdinal( domainForm );
	}

	@Override
	public int getJdbcTypeCode() {
		return Types.INTEGER;
	}

	@Override
	public EnumJavaDescriptor getDomainJavaDescriptor() {
		return enumJavaDescriptor;
	}

	@Override
	public BasicJavaDescriptor getRelationalJavaDescriptor() {
		return relationalJavaDescriptor;
	}

	@Override
	public E readValue(
			ResultSet resultSet,
			String name,
			SharedSessionContractImplementor session) throws SQLException {
		final int ordinal = resultSet.getInt( name );
		final boolean traceEnabled = log.isTraceEnabled();
		if ( resultSet.wasNull() ) {
			if ( traceEnabled ) {
				log.trace(String.format("Returning null as column [%s]", name));
			}
			return null;
		}

		final E enumValue = toDomainValue( ordinal, session );
		if ( traceEnabled ) {
			log.trace(String.format("Returning [%s] as column [%s]", enumValue, name));
		}

		return enumValue;
	}

	@Override
	public void writeValue(
			PreparedStatement statement,
			E value,
			int position,
			SharedSessionContractImplementor session) throws SQLException {
		final Integer jdbcValue = value == null ? null : toRelationalValue( value, session );

		final boolean traceEnabled = log.isTraceEnabled();
		if ( jdbcValue == null ) {
			if ( traceEnabled ) {
				log.tracef( "Binding null to parameter: [%s]", position );
			}
			statement.setNull( position, getJdbcTypeCode() );
			return;
		}

		if ( traceEnabled ) {
			log.tracef( "Binding [%s] to parameter: [%s]", jdbcValue.intValue(), position );
		}

		statement.setInt( position, jdbcValue );
	}

	@Override
	@SuppressWarnings("unchecked")
	public String toSqlLiteral(Object value) {
		return Integer.toString( ( (E) value ).ordinal() );
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy