我上过课,它有5个字段,在数据库(MySQL)中都是String
类型,bean对应的表有2个varchar
类型,剩下3个是整数
类型。我正在通过 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 的新手,所以任何人都可以帮我解决这个问题。
最佳答案
将代码改成这样。正确调试代码,并查看哪个属性实际上作为 java.lang.String
的实例出现,理想情况下,根本原因是它应该仅作为 Integer 出现。
但解决方法是使用
解析它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)
数据库未返回 native 生成的标识值
我认为这意味着您正在尝试将 k 生成器与未正确配置的表列一起使用。它应该是 auto_increment
列,以便 IDENTITY
生成器工作。否则,数据库不会返回任何生成的 ID。
更好的用户 type = long
<id column="vehicleno" name="vehicleno" type="java.lang.Integer">
<generator class="increment"/>
</id>
关于java - 如何解决 java.lang.ClassCastException : hibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25498067/