@Override public void setParameterValues(Properties parameters) { final ParameterType reader = (ParameterType) parameters.get(PARAMETER_TYPE); // IMPL NOTE : be protective about not setting enumValueMapper (i.e. calling // treatAsNamed/treatAsOrdinal) // in cases where we do not have enough information. In such cases we do additional checks // as part of nullSafeGet/nullSafeSet to query against the JDBC metadata to make the // determination. if (reader != null) { enumClass = reader.getReturnedClass().asSubclass(Enum.class); final boolean isOrdinal; final javax.persistence.EnumType enumType = getEnumType(reader); if (enumType == null) { isOrdinal = true; } else if (javax.persistence.EnumType.ORDINAL.equals(enumType)) { isOrdinal = true; } else if (javax.persistence.EnumType.STRING.equals(enumType)) { isOrdinal = false; } else { throw new AssertionFailure("Unknown EnumType: " + enumType); } if (isOrdinal) { treatAsOrdinal(); } else { treatAsNamed(); } sqlType = enumValueMapper.getSqlType(); } else { String enumClassName = (String) parameters.get(ENUM); try { enumClass = ReflectHelper.classForName(enumClassName, this.getClass()).asSubclass(Enum.class); } catch (ClassNotFoundException exception) { throw new HibernateException("Enum class not found", exception); } final Object useNamedSetting = parameters.get(NAMED); if (useNamedSetting != null) { final boolean useNamed = ConfigurationHelper.getBoolean(NAMED, parameters); if (useNamed) { treatAsNamed(); } else { treatAsOrdinal(); } sqlType = enumValueMapper.getSqlType(); } } final String type = (String) parameters.get(TYPE); if (type != null) { sqlType = Integer.decode(type); } }
@Override public String toLoggableString(Object value, SessionFactoryImplementor factory) { if (enumValueMapper != null) { return enumValueMapper.toXMLString((Enum) value); } return value.toString(); }
@Override public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) throws SQLException { if (enumValueMapper == null) { resolveEnumValueMapper(rs, names[0]); } return enumValueMapper.getValue(rs, names); }
@Override public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws HibernateException, SQLException { if (enumValueMapper == null) { resolveEnumValueMapper(st, index); } enumValueMapper.setValue(st, (Enum) value, index); }
@Override public Object fromXMLString(String xmlValue) { return enumValueMapper.fromXMLString(xmlValue); }
@Override public String toXMLString(Object value) { return enumValueMapper.toXMLString((Enum) value); }
@Override public String objectToSQLString(Object value) { return enumValueMapper.objectToSQLString((Enum) value); }
private void treatAsNamed() { if (enumValueMapper == null || !NamedEnumValueMapper.class.isInstance(enumValueMapper)) { enumValueMapper = new NamedEnumValueMapper(); sqlType = enumValueMapper.getSqlType(); } }
private void treatAsOrdinal() { if (enumValueMapper == null || !OrdinalEnumValueMapper.class.isInstance(enumValueMapper)) { enumValueMapper = new OrdinalEnumValueMapper(); sqlType = enumValueMapper.getSqlType(); } }