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>
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>
你的'orderid' 设定的主键生成策略是什么?assigned?如果是,必须在程序里面指定啊
还有你的数据库是什么的?
+-------------+---------+------+-----+---------+----------------+
| 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”值。谢谢!!!
主键生成策略 是否native吗?
贴你的映射文件出来看看
<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>