Hibernate关联关系映射:一对多级联保存

原文地址:

http://blog.sina.com.cn/s/blog_981ee5d80102w884.html
一对多搭建的一个测试

向我们的客户表和订单表插入数据

现在我们是一个客户两个订单了

11-Hibernate关联关系映射:一对多级联保存

//建立关系:

扫描二维码关注公众号,回复: 5956213 查看本文章

单独的客户和单独的订单

这个时候双方都建立好联系了

11-Hibernate关联关系映射:一对多级联保存
 

这个时候我们来测试一下,执行

11-Hibernate关联关系映射:一对多级联保存
 

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=?

11-Hibernate关联关系映射:一对多级联保存
 

11-Hibernate关联关系映射:一对多级联保存
 

11-Hibernate关联关系映射:一对多级联保存
 

11-Hibernate关联关系映射:一对多级联保存
 

都是属于1号客户了

这样我们就完成了保存的操作

11-Hibernate关联关系映射:一对多级联保存
 

这里要保存3个,又保存客户又保存订单。

其实可以先删掉customer表和order表

我们让它重新的去插入

只要openSession();

11-Hibernate关联关系映射:一对多级联保存
 

11-Hibernate关联关系映射:一对多级联保存
瞬时对象的异常

就是一个持久态的对象关联了一个瞬时态的对象

客户肯定是持久的

11-Hibernate关联关系映射:一对多级联保存
 

因为它和session关联了,因为它是持久态对象

现在又想把我们的订单也保存。

现在订单没有和session关联,订单是一个瞬时的,不允许持久态对象去关联瞬时态对象。

所以在这里只保存一方是不行的,会报一个异常。

这个异常:就是持久态的对象,去关联一个瞬时的对象。

如果我在保存的时候只保存一方,在一对多的关系里面也是可以的

这个时候就需要一些配置

这个配置叫级联

hibernate中级联保存的效果

级联:操作当前对象的时候,关联的对象如何处理,这就是级联的一个操作。

我现在在保存客户的时候级联订单。

级联在配置的时候是有方向性的

  *就是在保存客户的时候,可以保存级联订单

  *保存订单的时候,可以选择级联客户。

保存谁级联谁

我在保存客户的时候把客户关联的订单一起保存了。

所以我们要在哪里配呢?

我们现在要做的是保存客户,同时去级联它的订单。

因为我一保存客户,set集合才是要保存的对象,所以我要在set集合上进行配置

所以我们就在set标签上加一个cascade

cascade里面有很多的值,我们在这里设置save-updae,也就是叫级联保存和更新

11-Hibernate关联关系映射:一对多级联保存
 

就是你在保存级联客户的时候可以级联,在更新的时候也可以级联。

现在运行这个程序,没有异常,而且我们看一下数据库中的记录。

11-Hibernate关联关系映射:一对多级联保存

客户表有一个

11-Hibernate关联关系映射:一对多级联保存

订单表也只有一个

而且这个订单是属于1号客户

这个时候我就可以完成级联保存了 

完成级联保存只要在这里加一个cascade="save-update"就可以了

11-Hibernate关联关系映射:一对多级联保存
 

如果我想在级联订单的时候保存客户

11-Hibernate关联关系映射:一对多级联保存
这个时候没有配置还是会报错的

11-Hibernate关联关系映射:一对多级联保存
 

这个时候就要在订单的一端,在many-to-one上才是我们关联订单的对象。

我们也是在这里配置一个cascade="save-update"

11-Hibernate关联关系映射:一对多级联保存

在order.hbm.xml中的many-to-one标签中配置cascade属性:级联保存

我们现在运行demo4

11-Hibernateå³èå³ç³»æ å°ï¼ä¸å¯¹å¤çº§èä¿å­
 

11-Hibernate关联关系映射:一对多级联保存
 

11-Hibernate关联关系映射:一对多级联保存
 

客户

11-Hibernate关联关系映射:一对多级联保存
 

订单

所以这里面是有一个级联操作的

在保存客户的时候,如果想要有级联订单,在Customer里面的set标签配置cascade就可以了

这是关于我们级联的一个操作

一对多我们如何去配置一个关系

这是我们一个级联保存的一个操作

既然我们已经知道级联的效果了

如果我们这里没有去设置这些关系的话,那肯定就不会了

11-Hibernate关联关系映射:一对多级联保存
 

我们有一个客户,有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),只有一条

11-Hibernate关联关系映射:一对多级联保存
 

我们现在有一个客户,3个订单了

11-Hibernate关联关系映射:一对多级联保存
 

订单1里面有customer的一个引用

11-Hibernate关联关系映射:一对多级联保存
1个客户有了

11-Hibernate关联关系映射:一对多级联保存
3个订单都有了

会发送4个insert语句

11-Hibernate关联关系映射:一对多级联保存
 

11-Hibernate关联关系映射:一对多级联保存
 

这就是4条insert语句

11-Hibernate关联关系映射:一对多级联保存
这个是更新外键的

我们现在演示一下保存customer的时候有几条

session.save(customer)

我每一次都想要一张新的表不用update,而用create,每次都会创建一个新的表,这个还是测试的时候去用。

11-Hibernate关联关系映射:一对多级联保存
 

11-Hibernate关联关系映射:一对多级联保存
 

我们现在执行这个程序

发现数据库中order1没有进来

11-Hibernate关联关系映射:一对多级联保存
order1是西三旗 没有进来 order里面只有两个

11-Hibernate关联关系映射:一对多级联保存

客户里面只有一个

11-Hibernate关联关系映射:一对多级联保存
 

总共只有3条insert,2条insert order

session.save(customer)总共只发送3条insert

最后我们要用session.save(order2)

那只有一条insert

执行之后发现客户表里面没有,只有订单里面有数据

11-Hibernate关联关系映射:一对多级联保存
 

11-Hibernate关联关系映射:一对多级联保存

11-Hibernate关联关系映射:一对多级联保存

客户表里面没有 

11-Hibernate关联关系映射:一对多级联保存
 

订单表里面没有关联的外键,因为没有指定具体的客户是谁,你在保存的时候谁能进去,谁进不去。

猜你喜欢

转载自blog.csdn.net/qfc8930858/article/details/89371366
今日推荐