我已经上课它有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的新手,所以任何人都可以帮我解决这个问题。
答案 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之前进行空值检查。