Вы можете сопоставить перечисление как ORDINAL или STRING с аннотациями гибернации, например:
@Enumerated(EnumType.ORDINAL)
private State state;
Порядковое сопоставление помещает порядковый номер перечисления в базу данных. Если вы измените порядок значений перечисления в своем коде, это будет конфликтовать с существующим состоянием базы данных. Сопоставление строк помещает имя перечисления в верхнем регистре в базу данных. Если вы переименуете значение перечисления, вы получите ту же проблему.
Если вы хотите определить пользовательское сопоставление (например, ваш код выше), вы можете создать реализацию org.hibernate.usertype.UserType
, которая явно отображает перечисление.
Сначала я предлагаю некоторые изменения в вашем перечислении, чтобы сделать возможным следующее:
public enum State {
ACTIVE("active"), INACTIVE("inactive");
private String stateName;
private State(String stateName) {
this.stateName = stateName;
}
public State forStateName(String stateName) {
for(State state : State.values()) {
if (state.stateName().equals(stateName)) {
return state;
}
}
throw new IllegalArgumentException("Unknown state name " + stateName);
}
public String stateName() {
return stateName;
}
}
А вот простая (!) реализация UserType:
public class StateUserType implements UserType {
private static final int[] SQL_TYPES = {Types.VARCHAR};
public int[] sqlTypes() {
return SQL_TYPES;
}
public Class returnedClass() {
return State.class;
}
public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner) throws HibernateException, SQLException {
String stateName = resultSet.getString(names[0]);
State result = null;
if (!resultSet.wasNull()) {
result = State.forStateName(stateName);
}
return result;
}
public void nullSafeSet(PreparedStatement preparedStatement, Object value, int index) throws HibernateException, SQLException {
if (null == value) {
preparedStatement.setNull(index, Types.VARCHAR);
} else {
preparedStatement.setString(index, ((State)value).stateName());
}
}
public Object deepCopy(Object value) throws HibernateException{
return value;
}
public boolean isMutable() {
return false;
}
public Object assemble(Serializable cached, Object owner) throws HibernateException
return cached;
}
public Serializable disassemble(Object value) throws HibernateException {
return (Serializable)value;
}
public Object replace(Object original, Object target, Object owner) throws HibernateException {
return original;
}
public int hashCode(Object x) throws HibernateException {
return x.hashCode();
}
public boolean equals(Object x, Object y) throws HibernateException {
if (x == y) {
return true;
}
if (null == x || null == y) {
return false;
}
return x.equals(y);
}
}
Тогда отображение станет:
@Type(type="foo.bar.StateUserType")
private State state;
Другой пример реализации UserType см. по адресу: http://www.gabiaxel.com/2011/01/better-enum-mapping-with-hibernate.html
person
Adriaan Koster
schedule
21.10.2015
ACTIVE("ACTIVE")
??? - person Jordi Castilla   schedule 21.10.2015