私がこの列挙型を持っているとしましょう:
public enum TestEnum { EXAMPLE, FURTHER_EXAMPLE, LAST_EXAMPLE }
.hbm
のこのマッピングでは:
<property name="testEnum" column="TEST_COLUMN">
<type name="org.hibernate.type.EnumType">
<param name="enumClass">p.a.c.k.TestEnum</param>
</type>
</property>
列挙型は、0
、1
、2
としてデータベースに送信されます。代わりに、値をEXAMPLE
、FURTHER_EXAMPLE
、またはLAST_EXAMPLE
としてvarchar列に格納したいと思います。
列挙型をvarchar列にマップするにはどうすればよいですか?
多分これはより説明的です
<param name="useNamed">true</param>
次のような注釈を使用できます。
public class MyClass {
TestEnum testEnum;
@column(name="TEST_COLUMN")
@Enumerated(EnumType.STRING)
public TestEnum getTestEnum(){
this.testEnum;
}
}
列挙型の値をvarcharとしてデータベースに保存する場合は、以下の手順に従ってください。
HibernateはUserTpeインターフェースを提供します。 UserTypeインターフェースを実装するクラスを作成する必要があります。
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.usertype.UserType;
public class EnumUserType<E extends Enum<E>> implements UserType {
private Class<E> clazz = null;
protected EnumUserType(Class<E> c) {
this.clazz = c;
}
private static final int[] SQL_TYPES = { Types.VARCHAR };
public int[] sqlTypes() {
return SQL_TYPES;
}
public Class returnedClass() {
return clazz;
}
public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner)
throws HibernateException, SQLException {
String name = resultSet.getString(names[0]);
E result = null;
if (!resultSet.wasNull()) {
result = Enum.valueOf(clazz, name);
}
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, ((Enum) value).name());
}
}
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);
}
}
EncryptionStatus列挙型があるとします。
import Java.io.Serializable;
import com.google.gwt.user.client.rpc.IsSerializable;
public enum EncryptionStatus implements IsSerializable, Serializable {
PLAIN, HASH, RE_HASH, SUPER_HASH, SUPER_REHASH, OPEN, ENCRYPT, RE_ENCRYPT
}
作成したEnumUserType>を拡張するクラスを作成する必要があります。
public class EncryptionStatusType extends EnumUserType<EncryptionStatus>{
public EncryptionStatusType() {
super(EncryptionStatus.class);
}
}
ここで、列挙値をvarcharとしてデータベースに格納する列挙型マッピングの代わりに、hbm.xmlファイルで作成された上記のクラスをマッピングする必要があります。例えば、
<property name="secureStatus" type="com.nextenders.facadeimplementation.util.userenum.EncryptionStatusType" column="secure_status" />