读书人

Hibernate,级联保存为何无效?

发布时间: 2012-11-07 09:56:10 作者: rapoo

Hibernate,级联保存为什么无效??
有两个表分别是Customers和Orders,它们是一对多的关系,它们的*.hbm.xml文件分别是
Customer.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping package="org.pojo">
<class name="Customer" table="CUSTOMERS" dynamic-insert="true" dynamic-update="true" >
<id name ="id" column ="ID" type="integer">
<generator class="sequence">
<param name="sequence">seq_id</param>
</generator>
</id>

<property name="name" column="NAME" type="string" not-null="true"></property>
<property name="sex" access="field"></property>

<set name="orders"
inverse="true"
cascade="save-update">
<key column="CUSTOMER_ID"></key>
<one-to-many class="org.pojo.Order"/>
</set>

<property name="totalPrice" formula=" (select sum(o.price) from ORDERS o where o.CUSTOMER_ID=ID)"/>
<property name="description" column="DESCRIPTION" type="text"></property>
</class>
</hibernate-mapping>

Order.hbm.xml文件为
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping package="org.pojo">
<class name="Order" dynamic-insert="true" dynamic-update="true" >
<id name ="id" column ="ID" type="integer">
<generator class="sequence" >
<param name="sequence">seq_order_id</param>
</generator>
</id>

<property name="orderNumber" column="ORDER_NUMBER" type="string" ></property>
<property name="price"></property>

<many-to-one name="customer" class="org.pojo.Customer" >
<column name="CUSTOMER_ID"></column>
</many-to-one>
</class>

</hibernate-mapping>
因为我在Customer.hbm.xml的<set>中设置了cascade="save-update",理论上在新增Customer时应该级联保存Order的,
但发现Customer能保存,Order无法保存。程序也没报错。我看到控制台上对于Customers表是打印了insert语句,
但对于Orders表,打印的是update语句。为什么不是insert语句?为什么级联无法保存Order?

Customer customer = new Customer("LiShi","Lin",'M',new HashSet(),null);
Order order1 = new Order("Order0001",100.0,customer );
customer_1.getOrders().add(order1);
saveCustomer_1(customer);

在持久类的Customer也设置有Order的setter/getter了。

[解决办法]
<set name="orders"
inverse="true"
cascade="save-update">
<key column="CUSTOMER_ID"> </key>


<one-to-many class="org.pojo.Order"/>
</set>
把inverse去掉试试
[解决办法]

引用楼主 fog911811 的帖子:
Customer customer = new Customer("LiShi","Lin",'M',new HashSet(),null);
Order order1 = new Order("Order0001",100.0,customer );
customer_1.getOrders().add(order1);
saveCustomer_1(customer);

[解决办法]
Java code
Employee e=new Employee();Reward r=new Reward();r.setEmployee(e);session.save(r);
[解决办法]
你设置了inverse="true"就是所谓的控制反转, 这样子一来时方便在多的一端(Order)保存时顺便保存了(Customers) 一的一端
再多的一端保存时
Customer customer = new Customer("LiShi","Lin",'M',new HashSet(),null);
Order order1 = new Order("Order0001",100.0,customer );
order1.setCustomer(Customer);
saveOrder(order1 );
这样两条同时保存 这就是设置 inverse="true"的好处

现在你将控制放在了多的一端(Order) 那么在一的一端你需要下面这样才行

Customer customer = new Customer("LiShi","Lin",'M',new HashSet(),null);
Order order1 = new Order("Order0001",100.0,customer );
order1.setCustomer(customer );
customer_1.getOrders().add(order1);
saveCustomer_1(customer);

这时候就能正常级联保存
在有问题的话 就到电驴里面下载一下 尚学堂 j2ee 视频教程,里面有详细的解释

读书人网 >Java Web开发

热点推荐