【发布时间】:2014-08-02 13:44:38
【问题描述】:
我的程序中有订单和商品实体类。在订单类中有一组 物品。当我插入订单时,必须将订单详细信息插入到订单表中。并且必须将 Set 中的项目插入到 Items 表中,该表具有 Order 表中 order_id 的外键。因此,我想要的查询是:
insert into ordertb (cName) values (?);
insert into item (id, order_id, qty) values(?,?,?);
insert into item (id, order_id, qty) values(?,?,?);
insert into item (id, order_id, qty) values(?,?,?);
// until all the items are inserted
但是hibernate会生成以下查询:
Hibernate: insert into ordertb (cName) values (?)
Hibernate: update item set qty=?, order_id=? where id=?
Hibernate: update item set qty=?, order_id=? where id=?
Hibernate: update item set qty=?, order_id=? where id=?
Hibernate: update item set order_id=? where id=?
Hibernate: update item set order_id=? where id=?
Hibernate: update item set order_id=? where id=?
这是我的映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Order" table="ordertb">
<meta attribute="class-description">
This class contains the Order detail.
</meta>
<id name="order" type="int" column="order_id">
<generator class="native"/>
</id>
<property name="cName" column="cName" type="string"/>
<set name="items" table="item" fetch="select" cascade="all">
<key>
<column name="order_id" not-null="true"></column>
</key>
<one-to-many class="Item"/>
</set>
</class>
</hibernate-mapping>
TestComp.java 我调用方法的地方
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author Deepan
*/
public class TestComp {
private static SessionFactory factory;
public static void main(String args[]){
try{
factory = new Configuration().configure().buildSessionFactory();
}catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
System.out.println("Error");
throw new ExceptionInInitializerError(ex);
}
TestComp ME = new TestComp();
Order od=new Order();
Set<Item> items=new HashSet<Item>();
Item i1=new Item(1, 5, od);
items.add(i1);
Item i2=new Item(2, 20, od);
items.add(i2);
Item i3=new Item(3, 15, od);
items.add(i3);
od.setOrder(200);
od.setcName("Deepan");
od.setItems(items);
/* Add few employee records in database */
Integer car1 = ME.addOrder(od);
System.out.println(od.getOrder()+" : "+od.getcName()+" : "+od.getItems());
//Integer car2 = ME.addOrder(6, "Benz", "gtr");
//Integer car3 = ME.addOrder(7, "Audi", "sdf");
}
public Integer addOrder(Order order) {
Session session = factory.openSession();
Transaction tx = null;
Integer carVIN = null;
try {
tx = session.beginTransaction();
carVIN = (Integer) session.save(order);
tx.commit();
} catch (HibernateException e) {
if (tx != null) {
tx.rollback();
}
e.printStackTrace();
} finally {
session.close();
}
return carVIN;
}
}
怎么了?如果您需要任何其他信息,请在评论中提及。由于我对休眠很陌生,请给我一个详细的答案。提前致谢。
【问题讨论】:
-
请在您保存对象的位置添加代码 sn-p
-
我已将代码添加到问题中
-
Items 包含包含 Items 的 Order 对象的 Item 对象?您的数据图有问题。
标签: java mysql sql sql-server hibernate