Tengo una clase enum nombre de Estado de la siguiente manera

public enum Status {
    PENDING(0), SUCCESS(1), FAILED(-1);

    private int st;

    private Status(int st){
        this.st = st;
    }
}

y de otra clase que yo intente asignar este estado enum

public void setStatus(Status status) {
        this.status = status;
    }

    @Enumerated(EnumType.ORDINAL)
    public Status getStatus() {
        return status;
    }

cuando ejecuto este código, tengo

java.lang.IllegalArgumentException: Desconocido valor ordinal para la enumeración de datos de la clase.Estado: -1
en org.hibernate.tipo.EnumType.nullSafeGet(EnumType.java:93)
en org.hibernate.tipo.CustomType.nullSafeGet(CustomType.java:124)
en org.hibernate.tipo.AbstractType.hidratar(AbstractType.java:106)
en

pero ya tengo -1 en la enumeración de definición.

OriginalEl autor user1479203 | 2012-07-16

3 Comentarios

  1. 10

    Podría definir su propio UserType que define el modo de Hibernación debe asignar esas enumeraciones.

    Tenga en cuenta que el ordinal define el índice del valor de enumeración y por lo tanto FAILED tendría el ordinal 2. Mapa de la enumeración con sus propiedades, su necesidad de un UserType aplicación.

    Algunos enlaces:

    Utilice el enlace de abajo para un buen tutorial. Me ayudó a entender claramente. gabiaxel.com/2011/01/better-enum-mapping-with-hibernate.html

    OriginalEl autor Thomas

  2. 8

    Aquí es una solución en la que una cadena de la etiqueta se utiliza en lugar de un int id, sin embargo es fácil de adaptar.

    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();
    }
    }
    Yo hice lo mismo. Pero me da la columna «user_role_type» es de tipo de usuarios.función_usuario pero la expresión es de tipo bytea

    OriginalEl autor user3099799

  3. 1

    Me gustaría sugerir la siguiente solución. Al principio yo estaba supprised funcionó, pero es realmente simple:
    Para enum:

        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;
    }
    }

    clase

    class StatedObject{
    @Column("status")
    private int statusInt;
    public Status getStatus() {
    return Status.parse(statusString);
    }
    public void setStatus(Status paymentStatus) {
    this.statusInt = paymentStatus.getStatus();
    }
    public String getStatusInt() {
    return statusString;
    }
    public void setStatusInt(int statusInt) {
    this.statusInt = statusInt;
    }
    }

    si usted está usando hibernate en modo de hibernación archivo xml sería:

     <property name="statusInt "    column="status" type="java.lang.Integer" />

    que es

    OriginalEl autor Dariusz Dudziński

Dejar respuesta

Please enter your comment!
Please enter your name here