博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate总结(二)
阅读量:6969 次
发布时间:2019-06-27

本文共 4226 字,大约阅读时间需要 14 分钟。

在上一篇简单总结了一级缓存,快照,增删改查的简单使用,这一篇总结两张表的级联操作

级联涉及到三种情况,many-many,1-many,many-1。

  • 首先是1-many,many-1情况,所以先设置一个情景:客户与订单的关系
//因为太占版面缘故,没有列出get()/set()方法public class Customer {    private Integer id;    private String name;    private Set
orders = new HashSet
();//1对多}public class Order { private Integer id; private String name; private Customer customer;//多对1}

接下来是hibernate.cfg.xml与两个实体类的配置文件Order.hbm.xml与Customer.hbm.xml,第一个不多说,主要是映射文件的配置

//Customer.hbm.xml
//Order.hbm.xml

一切准备就绪,开始级联的代码:

因为代码中大量使用了得到连接,关闭连接操作,所以我使用了模板设计模式,在我的文章《》有讲解

/**     * 级联保存:     * 1.inverse="true",维护关系,最好只有一方维护,而且是拥有外键一方维护     * 2.cascade="save-update",级联保存与级联更新     */    @Test    public void test0() {        new SessionTemplate(){            @Override            public void fun(Session s) {
Customer c=new Customer(); c.setName("King"); Order o1=new Order(); o1.setName("炒面"); Order o2=new Order(); o2.setName("肉"); o1.setCustomer(c);//由拥有外键一方维护关系 o2.setCustomer(c); s.save(c); s.save(o1); s.save(o2);//这样框架只执行了3条SQL语句 } }.execute(); }
/**     * 级联删除:     * 1.inverse="false"为默认处理方式:把客户的订单的外键修改为null,然后再删除客户     * 2.inverse="true"若客户不处理,会出错     */    @Test    public void test1() {        new SessionTemplate(){            @Override            public void fun(Session s) {
         //这是没有使用级联删除的情况,这时cascade为save-update Customer c=(Customer) s.get(Customer.class, 3); for(Order o:c.getOrders()){ s.delete(o); } s.delete(c);//此时,inverse="true",所以前面删除了所有客户的订单才能删除客户          //更改配置文件,cascade为delete,这时就是级联删除
Customer c=(Customer) s.get(Customer.class, 3);                s.delete(c);//这时不需要手动删除订单了
}        }.execute();    }
/**     * 级联更新    * cascade为save-update      */    @Test    public void test2() {        new SessionTemplate(){            @Override            public void fun(Session s) {                Customer c=(Customer) s.get(Customer.class, 2);                for(Order o:c.getOrders()){                    o.setName("羊杂汤");//持久态,不需要更新                }            }        }.execute();    }

查询涉及到了加载策略,所以很复杂,所以将在写在下一篇中。

  • 接下来说many-many的情况,还是先设置一个情景:学生与课程的关系
public class Student {    private Integer id;    private String name;    private Set
courses=new HashSet<>();//多对多}public class Course { private Integer id; private String name; private Set
students=new HashSet<>();//多对多}

接下来是两个实体类与数据库表的映射文件:

//Student.hbm.xml
//Course.hbm.xml

一切准备继续,开始代码工作:

/**     * 多对多     * 级联保存:    * 本来想也写上级联删除与级联更新,但是发现写的代码和我想要实现的结果不同,故没有贴出代码,额...我的意思就是我也不会...挺尴尬...     */    @Test    public void test0() {        new SessionTemplate(){            @Override            public void fun(Session s) {                Student s1=new Student();                s1.setName("King");                                Course c1=new Course();                c1.setName("数学");                Course c2=new Course();                c2.setName("英语");                                s1.getCourses().add(c1);//由学生维护关系                s1.getCourses().add(c2);//由学生维护关系                                s.save(s1);            }        }.execute();    }

增删改查,现在就差“查”没有写出,我将在下一篇总结中写出Hibernate的关于查询的加载策略。

 

转载于:https://www.cnblogs.com/kingofkai/p/6023415.html

你可能感兴趣的文章
mysql转日期比较_mysql 日期转换 比较
查看>>
python下载图片脚本_Python实现批量下载图片的方法
查看>>
堆排序python理解_python堆排序如何使用呢?
查看>>
5道java面试题_5道常见的Java面试题!值得一看
查看>>
mysql数据类型支持比较运_MySQL整理5—数据类型和运算符
查看>>
java反序列化成object_java常用知识:ObjectInputStream反序列化流
查看>>
Java程序编译后的扩展名_一个Java源程序经过编译后,得到的文件扩展名一定是.class。...
查看>>
java 菱形 乱码_(04)Spring MVC之Get方式传参访问Controller,从Controller返回json串出现菱形问号(?????)乱码,解决方法。...
查看>>
php怎么连kafka,php连接kafka
查看>>
php动态生成html,通用PHP动态生成静态HTML网页的代码
查看>>
dede个人中心php在哪,dedecms织梦如何自定义会员中心目录名称的方法
查看>>
linux 运维高级脚本生成器,Linux运维实例 高效运维的工具--shell脚本
查看>>
linux配置redis服务,Linux下安装Redis并设置相关服务
查看>>
poj1106
查看>>
个人知识管理工具 PinPKM
查看>>
Jobs in Codility they're hiring
查看>>
linux下VNC的配置及使用
查看>>
为什么.NET Framework就没有个专门的P/Invoke Library?
查看>>
Silverlight动态设置WCF服务Endpoint
查看>>
lucene对日期(date)和整形(int)处理
查看>>