Java 如何使用hibernate映射自定义枚举整数序号?
我有一个名为Status的枚举类,如下所示Java 如何使用hibernate映射自定义枚举整数序号?,java,hibernate,exception,enumeration,Java,Hibernate,Exception,Enumeration,我有一个名为Status的枚举类,如下所示 public enum Status { PENDING(0), SUCCESS(1), FAILED(-1); private int st; private Status(int st){ this.st = st; } } 从另一个类中,我尝试映射这个状态枚举 public void setStatus(Status status) { this.status = status
public enum Status {
PENDING(0), SUCCESS(1), FAILED(-1);
private int st;
private Status(int st){
this.st = st;
}
}
从另一个类中,我尝试映射这个状态枚举
public void setStatus(Status status) {
this.status = status;
}
@Enumerated(EnumType.ORDINAL)
public Status getStatus() {
return status;
}
当我运行这个代码时,我得到
java.lang.IllegalArgumentException:枚举类数据的序号值未知。状态:-1
位于org.hibernate.type.EnumType.nullSafeGet(EnumType.java:93)
在org.hibernate.type.CustomType.nullSafeGet上(CustomType.java:124)
位于org.hibernate.type.AbstractType.hydroge(AbstractType.java:106)
在
但是我在枚举定义中已经有了-1。您可以定义自己的
UserType
,它定义了Hibernate应该如何映射这些枚举
请注意,序号定义了枚举值的索引,因此FAILED
将使用序号2。要使用枚举的属性映射枚举,您需要一个UserType
实现
一些链接:
- (请参阅“Hibernate中的参数化枚举”部分)
public class User {
@Id
private int id;
@Type(type = "com.example.hibernate.LabeledEnumType")
private Role role;
}
public enum Role implements LabeledEnum {
ADMIN("admin"), USER("user"), ANONYMOUS("anon");
private final String label;
Role(String label) {
this.label = label;
}
@Override
public String getLabel() {
return label;
}
}
public interface LabeledEnum {
String getLabel();
}
public final class LabeledEnumType implements DynamicParameterizedType, UserType {
private Class<? extends Enum> enumClass;
@Override
public Object assemble(Serializable cached, Object owner)
throws HibernateException {
return cached;
}
@Override
public Object deepCopy(Object value) throws HibernateException {
return value;
}
@Override
public Serializable disassemble(Object value) throws HibernateException {
return (Serializable) value;
}
@Override
public boolean equals(Object x, Object y) throws HibernateException {
return x == y;
}
@Override
public int hashCode(Object x) throws HibernateException {
return x == null ? 0 : x.hashCode();
}
@Override
public boolean isMutable() {
return false;
}
@Override
public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner)
throws HibernateException, SQLException {
String label = rs.getString(names[0]);
if (rs.wasNull()) {
return null;
}
for (Enum value : returnedClass().getEnumConstants()) {
if (value instanceof LabeledEnum) {
LabeledEnum labeledEnum = (LabeledEnum) value;
if (labeledEnum.getLabel().equals(label)) {
return value;
}
}
}
throw new IllegalStateException("Unknown " + returnedClass().getSimpleName() + " label");
}
@Override
public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session)
throws HibernateException, SQLException {
if (value == null) {
st.setNull(index, Types.VARCHAR);
} else {
st.setString(index, ((LabeledEnum) value).getLabel());
}
}
@Override
public Object replace(Object original, Object target, Object owner)
throws HibernateException {
return original;
}
@Override
public Class<? extends Enum> returnedClass() {
return enumClass;
}
@Override
public int[] sqlTypes() {
return new int[]{Types.VARCHAR};
}
@Override
public void setParameterValues(Properties parameters) {
ParameterType params = (ParameterType) parameters.get( PARAMETER_TYPE );
enumClass = params.getReturnedClass();
}
}
公共类用户{
@身份证
私有int-id;
@类型(Type=“com.example.hibernate.LabeledEnumType”)
私人角色;
}
公共枚举角色实现LabeledEnum{
管理员(“管理员”)、用户(“用户”)、匿名(“匿名”);
私有最终字符串标签;
角色(字符串标签){
this.label=标签;
}
@凌驾
公共字符串getLabel(){
退货标签;
}
}
公共接口标签{
字符串getLabel();
}
公共最终类LabeledEnumType实现DynamicParameterizedType,UserType{
private Class我想建议以下解决方法。起初,我被支持它是有效的,但它非常简单:
对于枚举:
public enum Status {
PENDING(0), SUCCESS(1), FAILED(-1);
private int status;
private Status(int status){
this.status = status;
}
public String getStatus() {
return status;
}
public static Status parse(int id) {
Status status = null; // Default
for (Status item : Status.values()) {
if (item.getStatus().equals(id)) {
Status = item;
break;
}
}
return Status;
}
}
阶级
如果您在hibernate xml文件中使用hibernate,它将是:
<property name="statusInt " column="status" type="java.lang.Integer" />
就是这样使用下面的链接可以获得一个好的教程。它帮助我清楚地理解。我也这么做了。但它给我的专栏“用户角色类型”是用户类型。用户角色但表达式是bytea类型
<property name="statusInt " column="status" type="java.lang.Integer" />