前一篇讲完了一对多的关系,通过与JDBC对比应该能发现,是不是比JDBC简单了很多?

我们只需要把对象只间的包含或对应关系理清楚,完全不用我们自己来写SQL语句。所以使用hibernate框架后,我们的关注重点是业务逻辑,所有的SQL语句都不用再操心了。

上次忘记说明,如果使用增、删、改的操作,我们还需要再引入一个Transaction对象。代码如下所示:

    public static void main(String[] args) {Session session = HibernateSessionFactory.getSession();Transaction tx = session.beginTransaction();try {Author author = new Author("刘皇叔", "sb250");session.save(author);tx.commit();    //提交System.out.println("保存成功");} catch (Exception e) {tx.rollback();  //回滚}HibernateSessionFactory.closeSession();}

知道数据库中事务的客官应该对这个对象不陌生吧。所以执行了session对象的增、删、改后,一定要记得使用transaction对象进行提交。如果某个业务有多次数据的操作,那么一定记得使用事务。

接下来,我们继续上次未完成的任务。

二、多一对映射关系

上次我们已经生成了作者和博客表的关系,从作者的角度来看,作者对应博客是一对多,而从博客的角度来看,博客对应作者是多对一。所以博客实体类中的代码如下:

public class Blog  implements java.io.Serializable {private Integer id;private Author author;    //相当于数据库中的外键引用private String title;private String content;private Date createTime;private String type;//封装的get和set方法略
}

blog的映射文件中代码如下:

    <class name="com.pxy.entity.Blog" table="blog" catalog="blogdb"><id name="id" type="java.lang.Integer"><column name="id" /><generator class="native" /></id><many-to-one name="author" class="com.pxy.entity.Author" fetch="select"><column name="author_id" /></many-to-one><property name="title" type="java.lang.String"><column name="title" length="30" not-null="true" /></property><property name="content" type="java.lang.String"><column name="content" length="500" /></property><property name="createTime" type="java.util.Date"><column name="create_time" length="10" /></property><property name="type" type="java.lang.String"><column name="type" length="20" /></property></class>

里面的many-to-one就是多对一的关系。我们同样先不做任何修改,来查询一篇博客看看效果。

    public static void main(String[] args) {Session session = HibernateSessionFactory.getSession();Blog blog = (Blog)session.get(Blog.class, 6);System.out.println("标题:"+blog.getTitle());System.out.println("内容:"+blog.getContent());System.out.println("作者:"+blog.getAuthor().getUsername());HibernateSessionFactory.closeSession();}

结果如下:

接下来,我们来聊五毛钱的与映射关系有关的几个属性:not-null、fetch、lazy、cascade、inverse。

1)not-null

从名字就能看出来,这个表示非空,不用多说吧。


2)fetch

表示获取数据的方式,对应的值有两个:select和join。默认是select。它们的差别我们可以通过生成的SQL语句来看看。

select的结果如上图,默认只查询blog的内容,需要使用映射的author时,再次到数据库中查询。

我们将Blog的映射文件中many-to-one中的fetch的值设置为join,结果如下图:

区别是不是很明显!!!

使用join后,默认就使用多表联合的方式查询了所有的数据。

3)lazy

接下来,我们先把fetch的值还原为select。然后再把lazy的分别设置为proxy和false看效果对比。

         

左图为设置lazy的值为false(实时加载,实体类中包含的所有对象都一次性查询出来),

右图为设置lazy的值为proxy(延时加载,默认只查询blog的数据,当需要使用其中包含的对象时再去数据库查询)。

4)cascade

表示执行增、删、改时的级联操作。其值有:none、save-update、delete、delete-orphan、all、all-delete-orphan。

cascade属性

描  述

none

当Session操纵当前对象时,忽略其关联对象。它是cascade属性的默认值

save-update

当通过Session的save()、update()及saveOrUpdate()方法来保存或更新当前对象时,级联保存关联的临时对象,并且级联更新所有关联的游离对象

delete

当通过Session的delete()方法删除当前对象时,会级联删除关联的对象

all

包含save-update、delete的行为

delete-orphan

删除和当前对象解除关联关系的所有对象。  即当一个节点在对象图中成为孤儿节点时,删除该节点

all-delete-orphan

包含all和delete-orphan的行为

接下来,我们演示一下默认值和save-update,其它的值,各位客官可以自行试验哈。

4.1)不设置cascade属性

编码如下代码:

    public static void main(String[] args) {Session session = HibernateSessionFactory.getSession();Transaction tx = session.beginTransaction();//创建作者和博客对象Author author = new Author("刘皇叔", "sb250");Blog blog = new Blog("论持久战");//相互关联author.getBlogs().add(blog);blog.setAuthor(author);//保存作者或者保存博客session.save(author);//session.save(blog);//提交数据tx.commit();HibernateSessionFactory.closeSession();}

运行后查看结果,可以发现,只添加了作者或者博客(注意看代码,只添加作者或者只添加博客)。

4.2)把blog的映射文件和author的映射文件中的cascade属性设置为save-update

Test中的代码不做任何修改,再次运行看效果。

现在的添加操作就进行了级联,虽然我们只保存作者,或者只保存博客,但Session发现它内部还包含新的对象时就会级联更新。

5)inverse

表示是否由关联对象来主控级联关系。一般设置在一对多中的”一方“。看4.2图中的set标签中包含有inverse属性。

接下来,我们把inverse设置为false。

是不是发现多了一个update?

其实很好理解,因为把inverse设置为false后,表示没有主控方了,A执行了控制B的代码后,B也会再次执行控制A的代码,所以blog对象会发现:“哟,我还关联有author对象,那我必须要更新一下它的ID”。

今天的内容虽然简单,但大伙一定要把每个属性及每个属性的值都多练习几遍,不然很容易弄混效果。

想当初第一次讲这个的时候,自己都是晕晕的,快被学生问疯了···

转载于:https://blog.51cto.com/softi/1957959

《Java从入门到放弃》框架入门篇:hibernate中的多表对应关系(二)相关推荐

  1. jmeter-5-从入门到放弃【基础篇】

    一.Jmeter简介: 1.简介 Jmeter 是一款基于Java程序开发的可视化客户端 (类似postman客户端).具有开源.高可扩展性.高移植性.多线程框架等特点. 简单来说它就是:界面友好,能 ...

  2. dotnet 从入门到放弃的 500 篇文章合集

    本文是记录我从入门到放弃写的博客 博客包括 C#.WPF.UWP.dotnet core .git 和 VisualStudio 和一些算法,所有博客使用 docx 保存 下载:dotnet 从入门到 ...

  3. 《Java从入门到放弃》入门篇:hibernate查询——HQL

    不知不觉又到了hibernate的最后一篇了,只感觉时光飞逝~,岁月如梭~! 转眼之间,我们就···························,好吧,想装个X,结果装不下去了,还是直接开始吧· ...

  4. java代码审计_Java代码审计| Spring框架思路篇

    Java的WEB框架是Java进阶课程,当要进行Spring的漏洞分析,要有一定的Java代码知识储备. Java后端标准的学习路线:JavaSE->JavaEE->Java Web框架 ...

  5. 肺炎在家自学C#--从入门到放弃然后又入门又放弃又入门

    入门到第一次中断 去年的工作太忙,工作知识涉及面又广,大量学习的是管理经验,以及半导体检测设备现场故障处 理.下了班每天学一个小时软件,几个月过后,学习了有一百个小时.就没有然后了. 正如一切自学那样 ...

  6. Java Web 程序设计----基于SSM框架(正在更新中)

    Java Web 程序设计----基于SSM框架 提示:主要用于个人学习.复习.查阅等. 文章目录 Java Web 程序设计----基于SSM框架 一.网页前端开发基础 HTML文档结构 提示:以下 ...

  7. (转)Hibernate框架基础——在Hibernate中java对象的状态

    http://blog.csdn.net/yerenyuan_pku/article/details/52760627 在Hibernate中java对象的状态 Hibernate把对象分为4种状态: ...

  8. Java新手教程从入门到放弃从入门到精通(3)

    运算 关系运算 布尔类型   接着上一篇继续讲布尔类型,下面创建两个布尔类型的变量并输出看下结果: public static void main(String[] args) {boolean bo ...

  9. 〖大前端 - 基础入门三大核心之JS篇㉕〗- JavaScript 的数组的常用方法 (二)

    当前子专栏 基础入门三大核心篇 是免费开放阶段.推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费开放,购买任意白宝书体系化专栏可加 ...

最新文章

  1. 使用pinctrl 和 gpio 子系统的字符设备驱动
  2. MyISAM与InnoDB的索引实现
  3. python中object转str_python的id()函数介绍 python怎么将objectid转为str
  4. java网络编程(三)
  5. 算法题目——生成括号匹配
  6. 二分查找和二叉查找树
  7. python调试神器_你必须拥有的Python调试神器
  8. java 双等于 equals_在Java中等于equals vs Arrays.equals
  9. VS2013代码调试:[7]如何避免调试时加载符号
  10. 中小企业选择仓库管理软件免费版的七大特点
  11. ioDraw - 好用的流程图绘制软件
  12. 软件测试常见分辨率测试,兼容测试:常见的显示器分辨率
  13. 78个学术网站!史上最全常用文献数据库汇总!
  14. 注册造价工程师用书免费电子版_2019-2020造价工程师各科电子教材精讲高清课件拿来和大家免费分享.......
  15. Hugo作者、Go核心团队成员Steve Francia谈诞生13年的Go语言:生态系统、演化与未来[译]...
  16. CAPL基础篇-----CAPL中的定时器操作
  17. VMware虚拟机启动后出现黑屏解决方法
  18. 微信中怎么打开apk下载链接 微信跳转打开外部浏览器打开apk文件
  19. 80老翁谈人生(203):748工程支撑王选最终走向成功!
  20. C#手机号码段生成 前7位补全后4位

热门文章

  1. DOM(十四):代理检测和事件处理(跨浏览器)
  2. 巧用PHP双$功能兼容线上线下配置文件
  3. NET面试题:在C#中如何声明一个类不能被继承
  4. VMware 多款产品中存在严重漏洞
  5. 新漏洞可导致攻击者劫持Kindle
  6. D-Link 修复多个硬编码密码漏洞
  7. SWAP Detector:GrammaTech 开源 DevOps 应用安全测试工具
  8. 我发现了一个价值8500美元的 HackerOne 平台漏洞
  9. 路径取值之含正则表达式的的取值方法
  10. 【leetcode】931. Minimum Falling Path Sum