1.CartAction中checkout方法的代码:
public String checkout(){
System.out.println("cart---action--method--checkout");
Map session = ActionContext.getContext().getSession();
Cart cart=(Cart)session.get("cart");
User user=(User)session.get("user");
//  当结账时,新增一个订单
Orders order = new Orders();
order.setUser(user);
order.setDate(new Date());
// 将购物车cartItem中的每条记录依次写入每个订单项中
for(Iterator it = cart.getItems().values().iterator();it.hasNext();){
CartItem cartItem = (CartItem)it.next();
OrderItem orderItem = new OrderItem();
orderItem.setBook(bookServices.findBookById(cartItem.getBookid()));
orderItem.setQuantity(cartItem.getQuantity());
// 为每个订单项设定其订单号
                    orderItem.setOrders(order);
order.getOrderItems().add(orderItem);
}
// 保存订单order,并级联保存订单项orderItem
ordersServices.saveOrders(order);
         session.put("order", order);
return SUCCESS;
}
    ordersServices.saveOrders(order);不能级联保存2.OrderDAO.java中的saveOrders方法:
public Orders saveOrders(Orders order) {
Session session = getSession();
Transaction tx = session.beginTransaction();
System.out.println("ordersDAO1111111111111");
System.out.println("orderdate "+order.getDate());
System.out.println("orderItem size " + order.getOrderItems().size());
System.out.println("order user" + order.getUser().getUserid());
session.save(order);
System.out.println("ordersDAO2222222222222222");
tx.commit();
session.flush();
session.close();
return order;
}3.控制台打印:
cart---action--method--checkout
ordersDAO1111111111111
orderdate Fri Dec 04 14:01:04 CST 2009
orderItem size 3
order user2
2009-12-4 14:01:05 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet default threw exception
java.sql.SQLException: Field 'orderid' doesn't have a default value
......
......
......
         at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
at dao.impl.OrdersDAO.saveOrders(OrdersDAO.java:19)
at services.impl.OrdersServices.saveOrders(OrdersServices.java:21)
at action.CartAction.checkout(CartAction.java:100)4.Orders.hbm.xml中对应要级联的部分
<set name="orderItems" cascade="all" inverse="true">
<key>
<column name="orderid" not-null="true"></column>
</key>
<one-to-many class="vo.OrderItem"/>
</set>

解决方案 »

  1.   

    hbm.xml加lazy="false" 延迟加载
      

  2.   

     Field 'orderid' doesn't have a default value 
    你的'orderid' 设定的主键生成策略是什么?assigned?如果是,必须在程序里面指定啊
    还有你的数据库是什么的?
      

  3.   

    mysql> desc orderitem;
    +-------------+---------+------+-----+---------+----------------+
    | Field       | Type    | Null | Key | Default | Extra          |
    +-------------+---------+------+-----+---------+----------------+
    | orderItemId | int(11) | NO   | PRI | NULL    | auto_increment |
    | bookid      | int(11) | NO   | MUL | NULL    |                |
    | quantity    | int(11) | NO   |     | NULL    |                |
    | orderid     | int(11) | NO   | MUL | NULL    |                |
    +-------------+---------+------+-----+---------+----------------+
    各位好,这是我的数据库表,主键不是assigned,而是自增的,其中orderid是与orders表中的orderid相同,而且一定要有值,如果这个表字段设为“可以为空”就能在orderItem表中插入数据,但是每条记录中只有orderid是“null”值。谢谢!!!
      

  4.   

    那你的映射文件没写对啊
    主键生成策略 是否native吗?
    贴你的映射文件出来看看
      

  5.   

    orderItem.hbm.xml
    <hibernate-mapping>
    <class name="vo.OrderItem" table="orderitem">
    <id name="orderItemId" type="int">
    <column name="orderItemId" />
    <generator class="native" />
    </id>
    <many-to-one name="book" class="vo.Book">
    <column name="bookid"  not-null="true"/>
    </many-to-one>
    <property name="quantity" type="int">
    <column name="quantity" not-null="true" />
    </property>
    </class>
    </hibernate-mapping>orders.hbm.xml
    <hibernate-mapping>
    <class name="vo.Orders" table="orders">
    <id name="orderid" type="int">
    <column name="orderid" />
    <generator class="native" />
    </id>
    <property name="date" type="java.util.Date">
    <column name="date" not-null="true" />
    </property> <many-to-one name="user" class="vo.User">
    <column name="userid" />
    </many-to-one>

    <set name="orderItems" cascade="all" inverse="true">
    <key>
    <column name="orderid" not-null="true"></column>
    </key>
    <one-to-many class="vo.OrderItem"/>
    </set>
    </class>
    </hibernate-mapping>
      

  6.   

    你的orderItem应该配置一个到orders的many-to-one的连接