Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用hibernate映射自定义枚举整数序号?_Java_Hibernate_Exception_Enumeration - Fatal编程技术网

Java 如何使用hibernate映射自定义枚举整数序号?

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

我有一个名为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中的参数化枚举”部分)

这里有一个解决方案,使用字符串标签代替int-id,但是它很容易适应

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" />