Hibernate,级联保存为什么无效??

LINGO_Tecco 2009-04-08 04:54:09
有两个表分别是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了。
...全文
2051 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
独孤飞鹰 2012-10-31
  • 打赏
  • 举报
回复
你这是不可能插入进去的,在一对多关系中,通常只有一端维护关联关系,这里的customer端inverse设置为true表示关联关系交给多端来维护(order端),只有order端状态发生了变化,才会进行相应的级联操作,如果你想插入customer对象,同时级联插入order对象,必须设置customer端的inverse属性为false,表示custom端维护关联关系,删掉inverse也是不行的,因为他的默认值就是true。不过通常不建议在customer端设置inverse为false,关系维护通常交给多端
happycute 2010-02-03
  • 打赏
  • 举报
回复
虽然楼主 后来做的不是正解的方法
但是如果用“多控制一”的方法的话,不是也应该是对的吗?
caozhengbiao 2009-12-13
  • 打赏
  • 举报
回复
楼主应该仔细一点
caozhengbiao 2009-12-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wangdefeng 的回复:]
你设置了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 视频教程,里面有详细的解释


[/Quote]

正解
LINGO_Tecco 2009-04-20
  • 打赏
  • 举报
回复
期待热心人士来解答。
LINGO_Tecco 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wangdefeng 的回复:]
你设置了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"的好处

现在你将控制放在了多的一端(O…
[/Quote]

首先表示感谢。
我现已将一端(Costomer)的<set>设有inserve="true"了,但接照你的说法来保存,即
Customer customer = new Customer("LiShi","Lin",'M',new HashSet(),null);
Order order1 = new Order("Order0001",100.0,customer );
order1.setCustomer(customer);
saveOrder(order1);
发现现在Order端能保存了,但Customer就保存不了。
这好像在Customer.hbm.xml中设的cascade="save-update",一点作用都体现不出来。
LINGO_Tecco 2009-04-10
  • 打赏
  • 举报
回复
快下班了,周未期待热心人士来解答。
ben0759 2009-04-09
  • 打赏
  • 举报
回复

Employee e=new Employee();
Reward r=new Reward();
r.setEmployee(e);
session.save(r);


这样就可以了,因为你设置了cascade,这个是需要你在多方插入才会有反应的。
但是,你的update不知道是什么原因,你把sql语句打出来我看看才知道修改了什么。
LINGO_Tecco 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jourqel 的回复:]
引用楼主 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);


你保存的时候把order1也存进去~添加一个save~
[/Quote]

但我设了级联,不是保存了Customer就应该连Order一起保存的吗?
LINGO_Tecco 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 flowersove 的回复:]
<set name="orders"
inverse="true"
cascade="save-update">
<key column="CUSTOMER_ID"> </key>
<one-to-many class="org.pojo.Order"/>
</set>
把inverse去掉试试
[/Quote]

去掉了inverse还是不行。customer能保存,order还是保存不了。
jourqel 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 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);
[/Quote]

你保存的时候把order1也存进去~添加一个save~
flowersove 2009-04-09
  • 打赏
  • 举报
回复
<set name="orders"
inverse="true"
cascade="save-update">
<key column="CUSTOMER_ID"> </key>
<one-to-many class="org.pojo.Order"/>
</set>
把inverse去掉试试
LINGO_Tecco 2009-04-09
  • 打赏
  • 举报
回复
没人答就掉了??
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wangdefeng 的回复:]
你设置了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"的好处

现在你将控制放在了多的…
[/Quote]
楼上朋友说的不错
你试试,不行再说
关注
LINGO_Tecco 2009-04-09
  • 打赏
  • 举报
回复
自己先顶下。希望各位能个答案
wangdefeng 2009-04-09
  • 打赏
  • 举报
回复
你设置了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 视频教程,里面有详细的解释

LINGO_Tecco 2009-04-09
  • 打赏
  • 举报
回复
还没等到满意的答案
LINGO_Tecco 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ben0759 的回复:]
Java codeEmployee e=newEmployee();
Reward r=newReward();
r.setEmployee(e);
session.save(r);

这样就可以了,因为你设置了cascade,这个是需要你在多方插入才会有反应的。
但是,你的update不知道是什么原因,你把sql语句打出来我看看才知道修改了什么。
[/Quote]
不正是我设了cascade,才会级联保存的吗?customer表就有insert语句:如下
insert into CUSTOMER_1S (NAME, sex, ID) values (?, ?, ?)
但Order表就只是UPDATE语句:Hibernate: update ORDERS set CUSTOMER_ID=? where ID=?
我是新增的,在Order表当然没有相应的记录。
为什么实现不了保存Customer就同时保存Order?

81,107

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧