原文地址:
http://blog.sina.com.cn/s/blog_981ee5d80102w884.html
一对多搭建的一个测试
向我们的客户表和订单表插入数据
现在我们是一个客户两个订单了
//建立关系:
单独的客户和单独的订单
这个时候双方都建立好联系了
这个时候我们来测试一下,执行
Hibernate:
insert
into
customer
(cname)
values
(?)
Hibernate:
insert
into
orders
(addr, cno)
values
(?, ?)
Hibernate:
insert
into
orders
(addr, cno)
values
(?, ?)
Hibernate:
update
orders
set
cno=?
where
oid=?
Hibernate:
update
orders
set
cno=?
where
oid=?
都是属于1号客户了
这样我们就完成了保存的操作
这里要保存3个,又保存客户又保存订单。
其实可以先删掉customer表和order表
我们让它重新的去插入
只要openSession();
就是一个持久态的对象关联了一个瞬时态的对象
客户肯定是持久的
因为它和session关联了,因为它是持久态对象
现在又想把我们的订单也保存。
现在订单没有和session关联,订单是一个瞬时的,不允许持久态对象去关联瞬时态对象。
所以在这里只保存一方是不行的,会报一个异常。
这个异常:就是持久态的对象,去关联一个瞬时的对象。
如果我在保存的时候只保存一方,在一对多的关系里面也是可以的
这个时候就需要一些配置
这个配置叫级联
hibernate中级联保存的效果
级联:操作当前对象的时候,关联的对象如何处理,这就是级联的一个操作。
我现在在保存客户的时候级联订单。
级联在配置的时候是有方向性的
*就是在保存客户的时候,可以保存级联订单
*保存订单的时候,可以选择级联客户。
保存谁级联谁
我在保存客户的时候把客户关联的订单一起保存了。
所以我们要在哪里配呢?
我们现在要做的是保存客户,同时去级联它的订单。
因为我一保存客户,set集合才是要保存的对象,所以我要在set集合上进行配置
所以我们就在set标签上加一个cascade
cascade里面有很多的值,我们在这里设置save-updae,也就是叫级联保存和更新
就是你在保存级联客户的时候可以级联,在更新的时候也可以级联。
现在运行这个程序,没有异常,而且我们看一下数据库中的记录。
客户表有一个
订单表也只有一个
而且这个订单是属于1号客户
这个时候我就可以完成级联保存了
完成级联保存只要在这里加一个cascade="save-update"就可以了
如果我想在级联订单的时候保存客户
这个时候就要在订单的一端,在many-to-one上才是我们关联订单的对象。
我们也是在这里配置一个cascade="save-update"
在order.hbm.xml中的many-to-one标签中配置cascade属性:级联保存
我们现在运行demo4
客户
订单
所以这里面是有一个级联操作的
在保存客户的时候,如果想要有级联订单,在Customer里面的set标签配置cascade就可以了
这是关于我们级联的一个操作
一对多我们如何去配置一个关系
这是我们一个级联保存的一个操作
既然我们已经知道级联的效果了
如果我们这里没有去设置这些关系的话,那肯定就不会了
我们有一个客户,有3个订单,我们这里有箭头的,1号订单引用了这个客户,而这个客户又关联了2号和3号订单,然后在映射文件中双方都配置了cascade="save-upate",都可以进行级联保存,当我执行session.save(order1)的时候,它会发送一条insert语句,save(order1)会执行,order1里面有customer对象,因为我去配级联了,customer还关联了order2和order3,因为双方都配置了,当我session.save(customer)的时候,customer可以进去,order2可以进去,order3可以进去。
因为customer里面没有引用order1。
如果我session.save(order2)的时候只有一条,order可以进去。
如果sess.save(order1)的时候,order1可以进去,order1里面有什么对象,order1里面有customer对象,customer可以进去,customer关联了order2和order3,所以order2和order3也可以进去。
所以执行session.save(order1)的时候会发4条。save(customer)会执行3条,因为customer能进去,order1能进去,order2能进去,order1进不去,因为customer里面没有引用order1。如果我在这里session.save(order2),只有一条
我们现在有一个客户,3个订单了
订单1里面有customer的一个引用
会发送4个insert语句
这就是4条insert语句
我们现在演示一下保存customer的时候有几条
session.save(customer)
我每一次都想要一张新的表不用update,而用create,每次都会创建一个新的表,这个还是测试的时候去用。
我们现在执行这个程序
发现数据库中order1没有进来
客户里面只有一个
总共只有3条insert,2条insert order
session.save(customer)总共只发送3条insert
最后我们要用session.save(order2)
那只有一条insert
执行之后发现客户表里面没有,只有订单里面有数据
客户表里面没有
订单表里面没有关联的外键,因为没有指定具体的客户是谁,你在保存的时候谁能进去,谁进不去。