栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

休眠特定用户类型上的java.lang.verifyError

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

休眠特定用户类型上的java.lang.verifyError

不幸的是,如果您需要基于Enum的序数或名称之外的其他内容进行序列化,则@Enumerated无效。我设法找到了一种解决方案(从此处进行了稍微修改)。

import java.io.Serializable;import java.lang.reflect.Method;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.Properties;import org.hibernate.HibernateException;import org.hibernate.type.AbstractSingleColumnStandardBasicType;import org.hibernate.type.TypeResolver;import org.hibernate.usertype.ParameterizedType;import org.hibernate.usertype.UserType;public class GenericEnumUserType implements UserType, ParameterizedType {    private Class<? extends Enum> enumClass;    private Class<?> identifierType;    private Method identifierMethod;    private Method valueOfMethod;    private static final String defaultIdentifierMethodName = "name";    private static final String defaultValueOfMethodName = "valueOf";    private AbstractSingleColumnStandardBasicType type;    private int[] sqlTypes;    @Override    public void setParameterValues( Properties parameters )    {        String enumClassName = parameters.getProperty("enumClass");        try        { enumClass = Class.forName( enumClassName ).asSubclass( Enum.class );        }        catch (ClassNotFoundException exception) { throw new HibernateException("Enum class not found", exception);        }        String identifierMethodName = parameters.getProperty( "identifierMethod", defaultIdentifierMethodName );        try        { identifierMethod = enumClass.getMethod( identifierMethodName,        new Class[0]); identifierType = identifierMethod.getReturnType();        }        catch (Exception exception)        { throw new HibernateException("Failed to optain identifier method",         exception);        }        TypeResolver tr = new TypeResolver();        type = (AbstractSingleColumnStandardBasicType)tr.basic( identifierType.getName() );        if (type == null)        { throw new HibernateException( "Unsupported identifier type " + identifierType.getName() );        }        sqlTypes = new int[] { type.sqlType() };        String valueOfMethodName = parameters.getProperty( "valueOfMethod",    defaultValueOfMethodName);        try        { valueOfMethod = enumClass.getMethod( valueOfMethodName,     new Class[] { identifierType } );        }        catch ( Exception exception )        { throw new HibernateException( "Failed to optain valueOf method",         exception);        }    }    @Override    public Class returnedClass()    {        return enumClass;    }    @Override    public Object nullSafeGet( ResultSet rs, String[] names, Object owner )        throws HibernateException, SQLException    {        Object identifier = type.get( rs, names[0] );        try        { return valueOfMethod.invoke( enumClass, new Object[] { identifier } );        }        catch ( Exception exception )        { throw new HibernateException( "Exception while invoking valueOfMethod of enumeration class: ",         exception);        }    }    public void nullSafeSet( PreparedStatement st, Object value, int index )        throws HibernateException, SQLException    {        try        { Object identifier = value != null ? identifierMethod.invoke( value,       new Object[0] ) : null; st.setObject( index, identifier );        }        catch ( Exception exception )        { throw new HibernateException( "Exception while invoking identifierMethod of enumeration class: ",         exception );        }    }    @Override    public int[] sqlTypes()    {        return sqlTypes;    }    @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.hashCode();    }    public boolean isMutable()    {        return false;    }    public Object replace( Object original, Object target, Object owner )        throws HibernateException    {        return original;    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/435945.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号