/* * 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.test.hql; import java.io.Serializable; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; import org.hibernate.HibernateException; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.type.StandardBasicTypes; import org.hibernate.usertype.EnhancedUserType; /** * A custom type for mapping {@link org.hibernate.test.hql.Classification} instances * to the respective db column. * </p> * THis is largely intended to mimic JDK5 enum support in JPA. Here we are * using the approach of storing the ordinal values, rather than the names. * * @author Steve Ebersole */ public class ClassificationType implements EnhancedUserType { @Override public int[] sqlTypes() { return new int[] { Types.TINYINT }; } @Override public Class returnedClass() { return Classification.class; } @Override public boolean equals(Object x, Object y) throws HibernateException { if ( x == null && y == null ) { return false; } else if ( x != null ) { return x.equals( y ); } else { return y.equals( x ); } } @Override public int hashCode(Object x) throws HibernateException { return x.hashCode(); } @Override public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException { Integer ordinal = StandardBasicTypes.INTEGER.nullSafeGet( rs, names[0], session ); return Classification.valueOf( ordinal ); } @Override public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, SQLException { Integer ordinal = value == null ? null : new Integer( ( ( Classification ) value ).ordinal() ); StandardBasicTypes.INTEGER.nullSafeSet( st, ordinal, index, session ); } @Override public Object deepCopy(Object value) throws HibernateException { return value; } @Override public boolean isMutable() { return false; } @Override public Serializable disassemble(Object value) throws HibernateException { return ( Classification ) value; } @Override public Object assemble(Serializable cached, Object owner) throws HibernateException { return cached; } @Override public Object replace(Object original, Object target, Object owner) throws HibernateException { return original; } @Override public String objectToSQLString(Object value) { return extractOrdinalString( value ); } @Override public String toXMLString(Object value) { return extractName( value ); } @Override public Object fromXMLString(String xmlValue) { return Classification.valueOf( xmlValue ); } private String extractName(Object obj) { return ( ( Classification ) obj ).name(); } private int extractOrdinal(Object value) { return ( ( Classification ) value ).ordinal(); } private String extractOrdinalString(Object value) { return Integer.toString( extractOrdinal( value ) ); } }