|
仔细的看了下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
查看全部评分
-
|