转Hibernate 一对多关联的CRUD__@ManyToOne(cascade=(CascadeType.ALL))
一:Group和Users两个类
假定一个组里有n多用户,但是一个用户只对应一个用户组。
1.所以Group对于Users是“一对多”的关联关系@OneToMany
Users对于Group是“多对一”@ManyToOne
2.CRUD时候,希望是能从具体用户Users查到其对应的Group,反过来也能通过Group查到具体Users,所以是双向关联
(所以要用mappedBy去除冗余信息)
- 1234567891011121314151617@Entity@Table(name="t_Group")//指定一个表名public class Group{private int id;private String name;private Set<Users> users = new HashSet<Users>();@Id@GeneratedValue//主键用自增序列public int getId() {return id;}@OneToMany(mappedBy="group",cascade=(CascadeType.ALL))//以“多”一方为主导管理,级联用ALLpublic Set<Users> getUsers() {return users;}
- 123456789101112131415161718@Entity@Table(name="t_Users")public class Users{private int id;private String name;private Group group;@Id@GeneratedValuepublic int getId() {return id;}@ManyToOne(fetch=FetchType.LAZY,cascade=(CascadeType.ALL))//解决1+N,级联用ALL@JoinColumn(name="groupId")//指定外键名称,不指定的默认值是group_Idpublic Group getGroup() {return group;}
二:C增
cascade:级联,只影响cud,不影响r
(all全都级联,persist存储时级联,remove删除时级联)
如果没有设置cascade,默认需要save(Group)和save(users),两个都要存,设置级联之后,只存一个就行了
级联依赖于这句:@ManyToOne(cascade=(CascadeType.ALL))//需要依赖于其他的东西时候
设置好正反向之后,多个有级联关系的对象就一起被保存了
- 123456789101112131415161718192021222324252627@Testpublic void testC() {Session session = HibernateUtil.getSessionFactory().getCurrentSession();session.beginTransaction();Users u1 = new Users();Users u2 = new Users();u1.setName("u1");u2.setName("u2");//u1和u2的id自增Group g = new Group();g.setName("g1");//g的id自增g.getUsers().add(u1);//正向g.getUsers().add(u2);u1.setGroup(g);//反向u2.setGroup(g);//不然u1和u2中的group信息为空session.save(g);//因为设置级联,所以存储g时候也把u1和u2存上了。//不设置级联的话,还要存储u1和u2session.getTransaction().commit();HibernateUtil.getSessionFactory().close();}
三:R查
默认会这样处理(平时管用的思路也是这样):
1.取“多”的时候,把“一”取出来
2.取“一”时,不取“多”的,用到时候再去取(看user信息时候一般看组名,看group时候user信息太多不必看)
fetch管读取,cascade管增删改
@OneToMany(mappedBy=”group”,cascade=(CascadeType.ALL),fetch=FetchType.EAGER)
@OneToMany默认的是LAZY,@ManyToOne默认是EAGER
User u = (User)s.get(User.class,1);
//取user时候,把group也取出来,
- 12345678910111213141516Users u = (Users)session.get(Users.class,11);//取id为11号的u//hibernate产生的语句里也把group拿出来了:group1_.id as id0_0_,和group1_.name as name0_0_Hibernate:selectusers0_.id as id1_1_,users0_.groupId as groupId1_1_,users0_.name as name1_1_,group1_.id as id0_0_,group1_.name as name0_0_fromt_Users users0_left outer joint_Group group1_on users0_.groupId=group1_.idwhereusers0_.id=?
只取出Group的话,不会去查询里边的user
- 12345678910//只取出Group的话,不会去查询里边的userGroup group = (Group)session.get(Group.class,11);Hibernate:selectgroup0_.id as id0_0_,group0_.name as name0_0_fromt_Group group0_wheregroup0_.id=?
四:U更新
注意:fetch影响两者读取顺序(两边都设成EAGER要多取出一次),反正都要取,具体再试
@OneToMany,@ManyToOne都写cascade=(CascadeType.ALL)
update时候自动关联更新
- 1234//因为cascade=(CascadeType.ALL),所以自动关联更新Users u = (Users)session.load(Users.class,11);//取id为11号的uu.setName("u250");u.getGroup().setName("gp01");
五:D删
删多:实测只删掉目的项目,不关联其他
先load(就是select)一下,确认有之后,再删
没有遇到:不能直接s.delete(u),因为u和group有级联,group和所有users都有级联,一下就够给删掉了的情况
不过严谨起见,还是设置一个u.setGroup(null);比较好
- 1234Users u1 = new Users();u1.setId(18);u1.setGroup(null);//严谨起见,应该先让俩表脱离关联session.delete(u1);
HQL对应的语句(作用是一样的):s.createQuery(“delete from User u where u.id = 1”).executeUpdate();//User是类名
删一:如果有子项目,报错不让删除
Group g = (Group)s.load(Group.class,1);
s.delete(g);
- 12345678Hibernate:deletefromt_Groupwhereid=?22:56:20,691 WARN SqlExceptionHelper:143 - SQL Error: 2292, SQLState: 2300022:56:20,692 ERROR SqlExceptionHelper:144 - ORA-02292: 违反完整约束条件 (SCOTT.FK9F52DA5D4E678049) - 已找到子记录
转Hibernate 一对多关联的CRUD__@ManyToOne(cascade=(CascadeType.ALL))的更多相关文章
- 03.Hibernate一对多关联
前言:在域模型中,类与类之间最普遍的关系就是关联关系,在UML语言中关联关系是有方向的.在数据库中表与表之间也会有关联关系,本节介绍通过Hibernate映射一对多的关联关系,这是一种最普遍的关联关系 ...
- hibernate一对多关联映射
一对多关联映射 映射原理 一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端.关联关系都是由多端维护,只是在写映射时发生了变化. 多对一和一对多的区别 多对一和 ...
- Hibernate一对多关联映射的配置及其级联删除问题
首先举一个简单的一对多双向关联的配置: 一的一端:QuestionType类 package com.exam.entity; import java.util.Set; public class Q ...
- Hibernate一对多关联
一对多双向关联关系:(Dept/Emp的案例) 既可以根据在查找部门时根据部门去找该部门下的所有员工,又能在检索员工时获取某个员工所属的部门. 步骤如下: 1.构建实体类(部门实体类加set员工集合) ...
- hibernate 一对多关联
package com.bjsxt.hibernate; import java.util.HashSet; import java.util.Set; import javax.persistenc ...
- hibernate 一对多双向关联 详解
一.解析: 1. 一对多双向关联也就是说,在加载班级时,能够知道这个班级所有的学生. 同时,在加载学生时,也能够知道这个学生所在的班级. 2.我们知道,一对多关联映射和多对一关联映射是一样的,都是在 ...
- Hibernate一对多单向关联和双向关联映射方法及其优缺点 (待续)
一对多关联映射和多对一关联映射实现的基本原理都是一样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不同.它们的区别在于维护的关系不同: 一对多关联映射是指在加载一的一端数据的同 ...
- Java进阶知识10 Hibernate一对多_多对一双向关联(Annotation+XML实现)
本文知识点(目录): 1.Annotation 注解版(只是测试建表) 2.XML版 的实现(只是测试建表) 3.附录(Annotation 注解版CRUD操作)[注解版有个问题:插入值时 ...
- Hibernate—— 一对多 和 多对多关联关系映射(xml和注解)总结(转载)
One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XML/Annotation) 懒加载和积极加载 一对多双向外键关联(XML/Annotati ...
随机推荐
- 关于JDK环境变量的配置问题
网上配置JDK环境变量的时候一直说要配置三个环境变量,什么JAVA_HOME,Path,CLASSPATH 其实是说以后如果要修改JDK的版本或者路径,只要更改JAVA_HOME就可以了,Path,C ...
- 【BZOJ】1651: [Usaco2006 Feb]Stall Reservations 专用牛棚(线段树/前缀和 + 差分)
http://www.lydsy.com/JudgeOnline/problem.php?id=1651 很奇妙.. 我们发现,每一时刻的重叠数选最大的就是答案.... orz 那么我们可以线段树维护 ...
- MFC通过button控制编辑框是否显示系统时间(动态显示)
1.在dlg.h中public bool flag; static UINT time(void *param); 2.在构造函数中 flag=false; 3.在button的生成函数中 if(fl ...
- how to use novaclient python api
ref: http://docs.openstack.org/developer/python-novaclient/api.html
- 浅谈Spring(一)
Spring 框架是一个分层架构,由 7 个定义良好的模块组成.Spring 模块构建在核心容器之上,核心容器定义了创建.配置和管理 bean 的方式. watermark/2/text/aHR0cD ...
- 对Python线程池
本文对Python线程池进行详细说明介绍,IDE选择及编码的解决方案进行了一番详细的描述,实为Python初学者必读的Python学习经验心得. AD: 干货来了,不要等!WOT2015 北京站演讲P ...
- css图标
一.介绍 采用这种字体,我们可以避免网站制作中采用好多图片,一方面解决了浏览器的兼容性问题.另一方面,这些字体都是矢量字体,我们只要在调整这些图标时,将他们的字体大小以及颜色,我们就可以解决很多不是图 ...
- Mock利器:PowerMock
powerMock不仅支持接口mock,final类.静态类.静态方法.私有方法都支持mock,还是很强大的: 1.gradle引用: myonlycompile('org.powermock:pow ...
- 获取软件的apk包名、查看手机设备名称等
获取软件的apk包名 1.下载aapt,这里使用的是SDK自带的aapt,找到SDK路径下面的aapt.exe,本机路径:E:\downloads\android-sdk_r23.0.2-window ...
- string类(三、string.format格式字符串)
参考连接: http://www.cnblogs.com/luluping/archive/2009/04/30/1446665.html http://blog.csdn.net/samsone/a ...