知道美河 | 上传资料 | VIP申请 | 精品课程 | 资料搜索 | 问题反馈 | 会员手册 | 积分消费 | 积分充值 | 帐号保护
美河学习学习在线赞助VIP

美河学习在线(主站) eimhe.com

 找回密码
 建立账号
查看: 10859|回复: 12

[原创] 点评Hibernate2.2多对多视频

[复制链接]
发表于 2006-12-28 13:29:00 | 显示全部楼层 |阅读模式
仔细的看了下Hibernate2.2 的视频,在此点评一下。呵呵。。。如有错误望大家指正。

首先wolfuni做的第一个例子属于双向的一对多。可能他没说。。我在此说一下一对多的种类。
一对多分单向一对多和双向一对多。其区别是在配置文件(表的映射文件)。
如果是单向一对多。就是属于多的一方(视频中Order-以后不说多的一方了全说order)配置文件不用添加<many-to-one>的。只要将属于一的一方(customer)的set属性设置一下就可以了。当然inverse默认为false。(inverse用法后面说)

保存的时候这样:

Transaction tx = session.beginTransaction();

Order order1 = new Order();
Order order2 = new Order();
Order order3 = new Order();

.....order中其他set就不写了

Customer customer = new Customer();
....customer set也省略了
customer.getOrders().add(order1);
customer.getOrders().add(order1);
customer.getOrders().add(order1);
session.save(customer);
tx.commit();

这里可以看到Order对象不知道如何被调用的。它属于被控方。所以执行后Order表出现2个SQL语句
insert into order ...... values(orderid , null);(忘了是不是这样的表结构了,注意那个null)
update order set cid="1",........

这里主要说为什么出现update这样的语句。因为Order属于被控方(inverse为true-不写的话默认为false)所以它不知道cid是多少。所以在建立的时候需要用null先代替然后执行的时候再update进这个值。
这就有个问题了。如果cid不可为空的话这里就会出现异常。。。。这也是单向一对多的问题。呵呵。。。
解决方法就先不说了。哈哈。。。

再说双向一对多。双向一对多其实是一对多和多对一的组合。也就是再主控方向设置单向一对多,被控方设置与其对应的多对一关系。。

这里在customer配置文件中set属性要配置inverse=true将控制方向反转。。
在Order中配置<many-to-one>name属性为多对一中一的字段。

在代码中如果还像上面写法会报错。因为order为主控方它需要知道cid是多少于是改写下:
Transaction tx = session.beginTransaction();

Order order1 = new Order();
Order order2 = new Order();
Order order3 = new Order();

.....order中其他set就不写了

Customer customer = new Customer();
....customer set也省略了
customer.getOrders().add(order1);
customer.getOrders().add(order1);
customer.getOrders().add(order1);
order1.setCustomer(customer);
order2.setCustomer(customer);
order3.setCustomer(customer);
session.save(customer);
tx.commit();
这样写就可以保存了。在视频中wolfuni让每个order都save一下个人认为是不对的。。这样破坏了一对多的体现。呵呵。。。。当然视频后面的代码中又把那些去掉了。。。

这样保存的sql只有一句就是
insert into order........;忘了具体是什么了。。。。

这就是为什么会出现2条SQL语句与1条语句的原因。。。。

wolfuni的一对一和多对多我还没看呢。等看完再看看有没有要补充的。呵呵。。。
祝大家学习快乐。。。

ps:这个帖子代码我还没测试。只是思想而已如果有错误请及时告诉我,我好改正代码。呵呵。。。

评分

1

查看全部评分

 楼主| 发表于 2006-12-28 13:38:22 | 显示全部楼层
忘了说件事。最后补充一下吧。。。
关于cascade(级联)的用法。

cascade表示主控方在进行操作时被控方是否同步执行同一操作。比如视频中主控方save操作被控方是否也进行save操作一样。
设置为all表示无论主控方执行什么操作被控方都进行对应操作。所以这里不用对Order进行save操作。。。
session.save(customer);就将order级联保存了。呵呵。。。。

还像补充,但是板凳被占了。哈哈。。。就编辑沙发吧。。

hibernate3中(2没实验过)
级联取是不管用的。呵呵。。。
比如上面例子
session.load(Customer.class,new Integer(1));
这样写的话是取不过来Customer对应的Order的。
必须加一句
customer.getOrders();
这样就能全部取出来了。我想这个问题可能是为了避免开销吧。。。。

[ 本帖最后由 adamed 于 2006-12-28 14:08 编辑 ]
发表于 2006-12-28 13:43:32 | 显示全部楼层
发表于 2006-12-28 13:52:16 | 显示全部楼层
视频还没有看到,还在传,我这网速很慢

占个位,看完视频再来光顾!
发表于 2006-12-28 16:17:26 | 显示全部楼层
hehe 还没来得及看,不过谢谢,到时看时可要仔细琢磨一下啊!
发表于 2006-12-28 17:57:20 | 显示全部楼层
 楼主| 发表于 2006-12-28 20:38:14 | 显示全部楼层
看完hibernate2.0和2.2没什么可补充的了。呵呵。。。

特别注明的是《深入浅出Hibernate》中关于多对多的例子不对。。应该像wolfuni这样做。。。
但暂时还没想明白错误的原因。呵呵。。产生的错误比较奇怪。。。
发表于 2006-12-29 00:52:12 | 显示全部楼层
adamed
  点评的好到位哟.只是我这里才下80%,,,等看过后也许同样有些小意见吧.

VIP的速度就是快..............偶要变VIP................
发表于 2006-12-29 12:22:23 | 显示全部楼层
发表于 2007-1-26 16:02:05 | 显示全部楼层
发表于 2007-1-26 21:18:37 | 显示全部楼层
最近我也在用hibernate做项目..关系一多就会不知道做了..学习hibernate只要过了这一关,以后的路应该会好走很多
发表于 2007-1-28 22:12:15 | 显示全部楼层
发表于 2007-8-26 19:10:29 | 显示全部楼层
您需要登录后才可以回帖 登录 | 建立账号

本版积分规则

 
QQ在线咨询

QQ|小黑屋|手机版|Archiver|美河学习在线 ( 浙网备33020302000026号 )

GMT+8, 2025-5-22 21:45

Powered by Discuz!

© 2001-2025 eimhe.com.

快速回复 返回顶部 返回列表