o2m中,我希望通过one方保存many方,代码如下,报错ClassCastException,请各位指正:one:Order    many:Item   service:OrderService    Test:ECommerceSystem
========================================================================
Order.hbm.xml:
<?xml version="1.0" encoding="gbk"?><!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.hibernate.sgl.association.o2m.entity">
<class name="Order" table="ec_order">
<id name="id" column="id" type="integer">
<generator class="sequence">
<param name="sequence">seq_order</param>
</generator>
</id>
<property name="name" column="name" type="string"/>
<property name="phone" column="phone" type="string"/>
<property name="address" column="address" type="string"/>
<set name="items" cascade="save-update">
<key column="orderid" />
<one-to-many class="Item"/>
</set>
</class>
</hibernate-mapping>
========================================================================
Item.hbm.xml:
<?xml version="1.0" encoding="gbk"?><!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.hibernate.sgl.association.o2m.entity">
<class name="Item" table="ec_item">
<id name="id" column="id" type="integer">
<generator class="sequence">
<param name="sequence">seq_item</param>
</generator>
</id>
<property name="product" column="product" type="string"/>
<property name="amount" column="amount" type="string"/>
<many-to-one name="order" class="Order" column="orderid"/>
</class>

</hibernate-mapping>
========================================================================
OrderService:...... public void modify(Order order){
Session session = null;
Transaction trans = null;
try{
session = factory.openSession();
trans = session.beginTransaction();
session.update(order);
trans.commit();
}catch(Exception e){
e.printStackTrace();
trans.rollback();
throw new RuntimeException(e);
}finally{
session.close();
}
}......
========================================================================
========================================================================
EcommerceSystem:package com.hibernate.sgl.association.o2m.client;import com.hibernate.sgl.association.o2m.service.OrderService;
import com.hibernate.sgl.association.o2m.entity.Order;
import com.hibernate.sgl.association.o2m.entity.Item;import java.util.Collection;
import java.util.Iterator;public class ECommerceSystem{
public static void main(String[] args){
OrderService orderService = new OrderService();
if(args[0].equalsIgnoreCase("additems")){
System.out.println("---add items for order " + args[1] + "---");
Order order = orderService.findById(Integer.parseInt(args[1]));
//System.out.println(order.getId()+" "+order.getName()+" "+order.getPhone()+" "+order.getAddress());
Item i = new Item();
i.setProduct("Computer");
i.setAmount(3);
order.addItem(i);
orderService.modify(order);

}else if(args[0].equalsIgnoreCase("findbyid")){
Order order = orderService.findById(Integer.parseInt(args[1]));
System.out.println(order.getId()+" "+order.getName()+" "+order.getPhone()+" "+order.getAddress()+" "+order.getItems()); }
}
}========================================================================
Order有addItem()
public void addItem(Item item){
items.add(item);
item.setOrder(this);
}运行java ...ECommerceSystem additems 1
通过order添加Item
报类型转换错误:
========================================================================
java.lang.ClassCastException: java.lang.Integer
        at org.hibernate.type.StringType.toString(StringType.java:44)
        at org.hibernate.type.NullableType.nullSafeToString(NullableType.java:93)
        at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:140)
        at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:107)
        at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2002)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2248)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2665)
        at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:60)
        at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:29
8)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
        at com.hibernate.sgl.association.o2m.service.OrderService.modify(OrderService.java:46)
        at com.hibernate.sgl.association.o2m.client.ECommerceSystem.main(ECommerceSystem.java:41)
Exception in thread "main" java.lang.RuntimeException: java.lang.ClassCastException: java.lang.Integer
        at com.hibernate.sgl.association.o2m.service.OrderService.modify(OrderService.java:50)
        at com.hibernate.sgl.association.o2m.client.ECommerceSystem.main(ECommerceSystem.java:41)
Caused by: java.lang.ClassCastException: java.lang.Integer
        at org.hibernate.type.StringType.toString(StringType.java:44)
        at org.hibernate.type.NullableType.nullSafeToString(NullableType.java:93)
        at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:140)
        at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:107)
        at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2002)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2248)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2665)
        at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:60)
        at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:29
8)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
        at com.hibernate.sgl.association.o2m.service.OrderService.modify(OrderService.java:46)
        ... 1 more

解决方案 »

  1.   

    没有取到数据将null 转为Integer类型
      

  2.   

         <id name="id" column="id" type="integer"> 
         把两个表中的以上代码中的type=integer换成long(或删掉),再把类定义
    中的id 类型改为Long(一定用成引用型),试下
      

  3.   

    谢谢上面两位朋友,是我笔误Item.hbm.xml中,amount的类型写错了,应该是integer,我写成了string