如何解决java.lang.ClassCastException:hibernate

时间:2014-08-26 04:29:14

标签: java mysql hibernate

我已经上课它有5个字段,并且在数据库(MySQL)中都是String类型,对应于bean的表有2 varchar类型,其余3个是integer类型。我正在通过session.save(obj)执行简单的插入操作。我的映射文件如下,

<hibernate-mapping>
<class name="com.aurodisplay.its.beans.VehicleRegisterBean"
    table="vehicle_details">
    <id column="vehicleno" name="vehicleno" type="java.lang.Integer">
        <generator class="native" />
    </id>
    <property column="vehicletype" name="vehicletype" type="java.lang.String"></property>
    <property column="model" name="model" type="java.lang.String"></property>
    <property column="clientid" name="clientid" type="java.lang.Integer"></property>
    <property column="groupid" name="groupid" type="java.lang.Integer"></property>

</class>
</hibernate-mapping> 

这是我的Java代码快照

Configuration configuration = new Configuration().configure();

    // 2. create sessionfactory
    SessionFactory sessionFactory = configuration.buildSessionFactory();

    // 3. Get Session object
    Session session = sessionFactory.openSession();

    // 4. Starting Transaction
    Transaction transaction = session.beginTransaction();

    VehicleRegisterBean vehicleRegisterBean=new VehicleRegisterBean();


    vehicleRegisterBean.setVehicletype(request.getParameter("vehicletype"));    
    vehicleRegisterBean.setModel(request.getParameter("model"));
    vehicleRegisterBean.setVehicleno(request.getParameter("vehicleno"));

    vehicleRegisterBean.setClientid(request.getParameter("clientid"));
    vehicleRegisterBean.setGroupname(request.getParameter("groupname"));

     session.save(vehicleRegisterBean);
     transaction.commit();
     System.out.println("\n\n Details Added \n");

我收到了ClassCastException,

SEVERE: Servlet.service() for servlet [com.abc.its.controller.VehicleRegister] in context with path [/ITS_Server] threw exception
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at org.hibernate.type.IntegerType.set(IntegerType.java:41)
at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:83)
at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:60)
at   org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:1947)
at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:1924)
at org.hibernate.persister.entity.AbstractEntityPersister$1.bindValues(AbstractEntityPersister.java:2102)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:32)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2108)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2588)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:48)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)

我是hibernate的新手,所以任何人都可以帮我解决这个问题。

2 个答案:

答案 0 :(得分:3)

将代码更改为类似的内容。正确调试代码,看看哪个属性实际上是java.lang.String的实例,理想情况下根本原因是它应该只作为整数。

但解决方法可以是使用

解析它
Integer.valueOf(String s);


vehicleRegisterBean.setVehicletype(request.getParameter("vehicletype"));    
vehicleRegisterBean.setModel(request.getParameter("model"));


vehicleRegisterBean.setVehicleno(Integer.valueOf(request.getParameter("vehicleno")));

vehicleRegisterBean.setClientid(Integer.valueOf(request.getParameter("clientid")));
vehicleRegisterBean.setGroupname(Integer.valueOf(request.getParameter("groupname")));

嗯,Integer.valueOf(String)的API确实说String的解释方式与Integer.parseInt(String)的解释完全相同。但是,valueOf(String)返回new Integer()个对象,而parseInt(String)返回原始int。

现在,如果你想要的是对象而不是原语,那么使用valueOf(String)

数据库未返回本机生成的标识值

我认为这意味着您正在尝试将k生成器与未正确配置的表列一起使用。它应该是auto_increment生成器的IDENTITY列。否则,数据库不会返回任何生成的ID。

更好的用户type = long

<id column="vehicleno" name="vehicleno" type="java.lang.Integer">
         <generator class="increment"/>
    </id>

答案 1 :(得分:2)

问题在于以下两点:

vehicleRegisterBean.setClientid(request.getParameter("clientid"));
vehicleRegisterBean.setGroupname(request.getParameter("groupname"));

您正在尝试将从request.getParameter返回的String转换为Integer值。

您需要将字符串值转换为Integer。

vehicleRegisterBean.setClientid(Integer.valueOf(request.getParameter("clientid")));
vehicleRegisterBean.setGroupname(Integer.valueOf(request.getParameter("groupname")));

注意:您可能需要使用变量从请求中获取值,并在转换为Integer之前进行空值检查。