简体   繁体   中英

How to resolve java.lang.ClassCastException: hibernate

I have been class it has 5 fields and all are of type String in database(MySQL) the table corresponding to bean has 2 varchar type remaining 3 are integer type. I am performing simple insert operation through session.save(obj) . My Mapping file is as follow ,

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

Here is my Java code snap

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");

I am getting 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)

I am new to hibernate, So can anyone help me to solve this .

change the code to something like this. Debug the code properly, and see which property actually is coming as instance of java.lang.String , ideally the root cause is it should come as Integer only.

But the workaround can be to parse it using

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")));

Well, the API for Integer.valueOf(String) does indeed say that the String is interpreted exactly as if it were given to Integer.parseInt(String) . However, valueOf(String) returns a new Integer() object whereas parseInt(String) returns a primitive int.

Now, if what you want is the object and not the primitive, then using valueOf(String)

The database returned no natively generated identity value

I think it means you're trying to use the k generator with a table column which is not properly configured. It should be an auto_increment column for the IDENTITY generator to work. Else, the database doesn't return any generated ID.

Better user type = long

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

Problem lies in these two lines:

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

You are trying to cast String returned from request.getParameter to Integer values.

You need to convert the string values to Integer.

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

Note: You may need to use variables to get the values from request and put in the null checks before converting to Integer.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM