博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hibernate(十)双向关联关系的CRUD
阅读量:6923 次
发布时间:2019-06-27

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

本文链接:

一、保存

1、

假设一个group有多个user,一个user只属于一个group,当保存user对象到数据库中时可以

User u = new User();u.setName("u1");Group g = new Group();g.setName("g1");u.setGroup(g);Session s = sessionFactory.getCurrentSession();s.beginTransaction();s.save(g);// 默认hibernate不会帮我们保存s.save(u);s.getTransaction().commit();

需要注意hibernate默认不会帮我们保存group对象,应该设置一下。

@ManyToOne有个属性cascade(级联),CascadeType它有

(1)ALL:所有的操作时对当前对象所有级联的对象都会被hibernate操作

(2)MERGE:调用merge()方法时(合并的时候)会进行级联 (MERGE=save+update)

(3)PERSIST:调用persist()方法时(存储的情况下)会进行级联

(4)PEFRESH: 当一个session从数据库中load了一个对象和它级联的对象到内存中,而另外一个session在数据库中对这个对象进行了修改,则hibernate会对第一个sesson load的对象级联的对象刷新操作 (A里面需要读B改过之后的数据)

(5)REMOVE: 删除的情况下会进行级联

(Cascade的属性指明做什么操作的时候关联对象是绑定在一起的)

测试:将User类的getGroup()方法上的@ManyToOne注解修改为@ManyToOne(cascade=(CascadeType.ALL)),然后注释掉上面代码块中s.save(g),运行程序可以发现group会被hibernate自动保存到数据库中。

2、

上面我们存user,关联的group hibernate会帮我们存进去,如果我们存group,关联的user会不会帮我们存进去呢?答:不会

User u1 = new User();u1.setName("u1");User u2 = new User();u1.setName("u2");User u3 = new User();u1.setName("u3");Group g = new Group();g.setName("g1");g.getUsers().add(u1);g.getUsers().add(u2);g.getUsers().add(u3);Session s = sessionFactory.getCurrentSession();s.beginTransaction();s.save(g);//这里如果不设置的话,u1,u2,u3不会自动帮我们存进去s.getTransaction.commit();

 

如果想让hibernate帮我们存入group的关联对象需要设置一下:将Group类中的getUsers()方法上的注解@OneToMany(mappedBy="group")修改为@OneToMany(mappedBy="group",cascade=(CascadeType.ALL)),注:如果只这么设置的话,u1,u2,u3存入数据库中后group_id都为NULL,因为u1,u2,u3对象中的group属性是null,所以需要在代码块中加u1.setGroup(g);u2.setGroup(g);u3.setGroup(g)。

规律:(1)多对一关系从多的一方操作比较简单;(2)如果关联关系是双向的,则需要设好导航(mappedBy);(3)双向关系在程序中要设定双向关联

 

二、读

1、get方式

我们先从数据库中get一个User出来

Session s = sessionFactory.getCurrentSession();s.beginTransaction();// 当我们从数据库中将这个对象取出来的时候不管设不设cascade都会把关联的Group对象取出来User u = (User)s.get(User.class , 1);s.getTransaction().commit;

 

我们从数据库中get一个Group出来,不管设不设cascade不会把关联的user取出来,cascade只在存储的时候有效,读取需要再另外设置:

将Group类中的getUsers()方法上注解@OneToMany(mappedBy="group",cascade=(CascadeType.ALL))修改为:@OneToMany(mappedBy="group",cascade=(CascadeType.ALL),fetch=FetchType.EAGER),然后就可以在代码块中写:

Group g = (Group)s.get(Group.class,1);// 如果不加上fetch则不会将关联的User取出来for(User u : g.getUsers()) {    System.out.println(u.getName());  }

 

User类中getGroup()方法上注解@ManyToOne默认FetchType是EAGER,因为

当我们从数据库中将这个user对象取出来的时候不管设不设cascade都会把关联的Group对象取出来

当我们将User类中注解@ManyToOne添加属性fetch=FetchType.LAZY时,当我们用到user关联的group时,才会取出来:

Session s = sessionFactory.getCurrentSession();s.beginTransaction();User u = (User)s.get(User.class , 1);// 这时不会取出groupSystem.out.println(u.getGroup().getName());// 这时会取出groups.getTransaction().commit;//System.out.println(u.getGroup().getName());这时会报错no session,原因是session已经关闭了。如果设置为EAGER则不会报错。

 

FetchType是个枚举类型,有:

(1)EAGER:(渴望)Define that data must be eagerly fetched

(2)LAZY:(懒惰)Define that data can be lazily fetched

 

2、load方式

 

三、更新

Session s = sessionFactory.getCurrentSession();s.beginTransactio();User u = (User)s.load(User.class , 1);u.setName("user");u.getGroup().setName("g");s.getTransaction().commit();//会发出两条update语句

 这样写可以但是我们通常更新的是处于游离状态的对象,而当user处于游离状态时session已经关闭了没法保存。

Session s = sessionFactory.getCurrentSession();s.beginTransaction();User u = (User)s.get(User.class,1);s.getTransaction().commit();u.setName("user");u.getGroup().setName("group");Session s2 = sessionFactory.getCurrentSession();s2.beginTransaction();s2.update(u);// 当User类中的getGroup()方法注解@ManyToOne添加属性cascade=CascadeType.ALL时,会更新group,否则当执行update方法时不会update Groups2.getTransaction().commit();

 

四、删除

1、删除一个User

Session s = sessionFactory.getCurrentSession();s.beginTransaction();User u = (User)s.load(User.class,1);s.delete(u);// 这时候会把u删除,然后会把u关联的group对象关联的所有user删除s.getTransaction().commit();

如果不想把group删除可以:

u.setGroup(null);s.delete(u);

还可以使用HQL:

Session s = sessionFactory.getCurrentSession();s.beginTransaction();s.createQuery("delete from User u where u.id=1");s.getTransaction().commit();

 

2、删除Group

Session s = sessionFactory.getCurrentSession();s.beginTransaction();Group g = (Group)s.load(Group.class,1);s.delete(g);// 这时候会把g删除会把g对象关联的所有user删除(当然已经设置了cascade=all)s.getTransaction().commit();

如果不想删除所有user,可以把user的group_id设成null。

 

转载地址:http://fkecl.baihongyu.com/

你可能感兴趣的文章
基于heartbeatV2版本的ha-gui工具对httpd做高可用集群(2)
查看>>
globbing
查看>>
网络安全课程笔记 第0章
查看>>
Solaris 10 x86系统上添加新硬盘
查看>>
我的友情链接
查看>>
Web服务器测试和监控工具及组件介绍
查看>>
搭理AD域控服务器
查看>>
FTP HA windows cluster
查看>>
139.00.007 Git学习-Cheat Sheet
查看>>
js的基本数据类型有哪些?
查看>>
html 5 新增标签及简介
查看>>
c#多线程中Lock()关键字的用法小结
查看>>
征服恐惧!用 Vim 写 iOS App
查看>>
Struts_登录练习(配置拦截器)
查看>>
ASP.NET Core 2.0 使用支付宝PC网站支付
查看>>
centos7安装mha4mysql
查看>>
Android ListView和ListAdapter(附电话簿实例)
查看>>
Linux磁盘管理之LVM详解
查看>>
我的友情链接
查看>>
关于通达Oa的一些问题,raid,论坛
查看>>