postanowiłem wdrożyć UserType ... to jest tak blisko do konfiguracji hibernacji jak mogę ... tutaj jest kod ...
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;
}
}
Rozważmy ten element własności
<property name="serialNumber" type="model.UpperCaseUserType">
<column name="SERIAL_NUMBER" length="20" not-null="true" unique="true" />
</property>
Rozumowanie ... Gdy hibernacja wstawi dane, ten typ przekształci ciąg znaków w wielkie litery. Gdy hibernacja wybiera dane, dzieje się to samo. Zaletą tej klasy, która po prostu zmienia kolejność get/set to uppercase jest wszystko, gdy używam Criteria do wybrania na serialNumber. Hibernacja spowoduje również zapisanie wielkich liter mojego parametru, ponieważ będzie rzutować/stosować ten sam typ, co zdefiniowany w konfiguracji tabeli.
Dlatego nie muszę pamiętać, aby ręcznie wpisywać wielkie liczby wszystkich moich kryteriów wyszukiwania dla numerów seryjnych ... hibernate zajmuje się tym dla mnie ... dokładnie to próbuję osiągnąć tutaj!
Mam JUnit, który pokazuje wszystkie z tych rzeczy, ale myślę, że moja odpowiedź jest zbyt duża, jak to jest ...
Mam przechwytywania zawierające inne "rzeczy", na które mogę wpaść na twój pomysł ... ale nie widzę pęcznienia logiki kilkunastu klas, które wymagają, aby niektóre z ich pól były wielkie. –