Я решил реализовать UserType ... он настолько близок к конфигурации гибернации, насколько я могу себе представить ... вот код ...
package model;
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;
public class UpperCaseUserType implements UserType {
private static final int[] TYPES = {Types.VARCHAR};
public int[] sqlTypes() {
return TYPES;
}
public Class returnedClass() {
return String.class;
}
public boolean equals(Object x, Object y) throws HibernateException {
if (x == y) {
return true;
}
if (null == x || null == y) {
return false;
}
return new EqualsBuilder().append(x, y).isEquals();
}
public int hashCode(Object o) throws HibernateException {
return new HashCodeBuilder().append(o).toHashCode();
}
public Object nullSafeGet(ResultSet resultSet, String[] strings, Object object) throws HibernateException, SQLException {
return ((String) Hibernate.STRING.nullSafeGet(resultSet, strings[0])).toUpperCase();
}
public void nullSafeSet(PreparedStatement preparedStatement, Object object, int i) throws HibernateException, SQLException {
String string = ((String) object).toUpperCase();
Hibernate.STRING.nullSafeSet(preparedStatement, string, i);
}
public Object deepCopy(Object o) throws HibernateException {
if (null == o) {
return null;
}
return new String(o.toString());
}
public boolean isMutable() {
return false;
}
public Serializable disassemble(Object o) throws HibernateException {
return (String) o;
}
public Object assemble(Serializable serializable, Object o) throws HibernateException {
return serializable;
}
public Object replace(Object o, Object arg1, Object arg2) throws HibernateException {
return o;
}
}
Рассмотреть этот элемент свойства
<property name="serialNumber" type="model.UpperCaseUserType">
<column name="SERIAL_NUMBER" length="20" not-null="true" unique="true" />
</property>
Итак, рассуждение ... Когда hibernate вставляет данные, этот тип преобразует строку в верхний регистр. Когда Hibernate выбирает данные, происходит то же самое. Преимущество этого класса перед простым изменением get / set bean-компонента на прописные все, когда я использую Критерии для выбора в serialNumber. Hibernate также будет прописывать мой параметр в верхнем регистре, так как он будет приводить / применять тот же тип, который определен в конфигурации таблицы.
Поэтому мне не нужно помнить, чтобы вручную прописывать все мои критерии поиска серийных номеров ... hibernate позаботился об этом за меня ... это именно то, чего я пытаюсь достичь здесь!
У меня есть JUnit, который демонстрирует все это, но я думаю, что мой ответ слишком велик ...