Hibernate(6)—— 一对多和多对多关联关系映射(xml和注解)总结

合集下载

Hibernate关联关系注解配置简单理解

Hibernate关联关系注解配置简单理解

Hibernate关联关系注解配置简单理解Hibernate关联关系注解配置什么是关联关系?关联关系有哪⼏种?关联关系指实体之间的关系,也就是表与表之间的关系。

⼀个关系⽤两个属性来描述,数量性和⽅向性。

从数量上来看,表与表之间主要有三种关系,⼀对⼀,⼀对多,多对多。

加上关系的⽅向,还有⼀个多对⼀。

hibernate中关联关系的维护在实际的业务开发中,对于两个有关联的数据库实体,⽐如学⽣对教室,我们通常还需要在操作⼀⽅时,维护两⽅彼此之间的关系。

关系的维护分为两类:1.级联Cascade,在操作⼀⽅时,是否对另⼀⽅也执⾏同样的操作。

2.外键的维护inverse,在操作⼀⽅时,是否⾃动维护外键关系。

⽐如如果将多⽅的对象添加给以⼀的⼀⽅,因为外键由多⽅维护,hibernate 为了保证添加的这个多⽅对象的外键是正确的,会⾃动给这个多⽅的外键设置值(也就是⼀的⼀⽅的主键)外键维护,在xml配置中使⽤inverse属性,在注解中使⽤mappedBy注解来声明。

cascade与inverse1.cascade,指把对当前对象的操作级联到关联对象上。

⼀般在one to one ,one to many设置级联。

配置了这个属性后,当对当前对象执⾏如save等更新数据库的操作时,当前实体所关联的实体也会执⾏相应的操作。

2.inverse默认值为true, 表⽰让对⽅来维护关系。

设为false,⾃⼰维护关系。

inverse主要有两个作⽤:1)维护外键主控⽅保存时,是否⾃动update被控⽅的外键字段。

外键字段指向的就是当前保存的实体。

2)维护级联决定当前设置的级联是否有⽤,⾃⼰维护关系时,对⽅设置的级联就不会⽣效,对⽅保存时不会让本⽅也保存。

⽽对⽅维护关系,则与此相反。

@mappedBy注解1)mappedBy(name="对⽅标准代表当前实体的属性“)2)只存在于OneToOne,OneToMany,ManyToMany, 不能在ManyToOne中3)与joincolumn或jointable互斥。

Hibernate注解中CascadeType用法汇总

Hibernate注解中CascadeType用法汇总

Hibernate注解中CascadeType用法汇总在Hibernate中,CascadeType注解用来配置实体之间的级联操作。

级联操作是指在对一个实体进行持久化、更新、删除等操作时,同时也对关联的其他实体进行相应的操作。

CascadeType注解常用于一对一、一对多、多对多等关联关系中。

CascadeType注解的常用取值有以下几种:1. CascadeType.ALL:表示所有的级联操作,包括持久化、更新、删除等。

2. CascadeType.PERSIST:表示级联持久化操作,即当实体被持久化时,关联的其他实体也会被持久化。

3. CascadeType.MERGE:表示级联更新操作,即当实体被更新时,关联的其他实体也会被更新。

4. CascadeType.REMOVE:表示级联删除操作,即当实体被删除时,关联的其他实体也会被删除。

5. CascadeType.REFRESH:表示级联刷新操作,即当实体被刷新时,关联的其他实体也会被刷新。

6. CascadeType.DETACH:表示级联脱管操作,即当实体脱管时,关联的其他实体也会被脱管。

7. CascadeType.ALL_DELETE_ORPHAN:表示级联删除操作,并且会删除所有孤儿实体。

下面是对CascadeType注解的使用方法进行汇总:1.一对一关联关系:```private Address address;```上述代码表示当保存、更新或删除一个实体对象时,操作对应的address实体也会被保存、更新或删除。

2.一对多关联关系:```private List<Order> orders;```上述代码表示当保存、更新或删除一个用户对象时,操作对应的所有订单对象也会被保存、更新或删除。

3.多对多关联关系:```private List<Role> roles;```上述代码表示当保存、更新或删除一个用户对象时,操作对应的所有角色对象也会被保存、更新或删除。

07Mybatis的多表查询1----1对多和多对1---@Results注解用法总结

07Mybatis的多表查询1----1对多和多对1---@Results注解用法总结

07Mybatis的多表查询1----1对多和多对1---@Results注解⽤法总结1.表与表之间的关系及其举例表之间的关系有4种:⼀对多、多对⼀、⼀对⼀、多对多。

举例: (1)⽤户和订单就是⼀对多 ⼀个⽤户可以下多个订单 (2)订单和⽤户就是多对⼀ 多个订单属于同⼀个⽤户 (3)⼈和⾝份证号就是⼀对⼀ ⼀个⼈只能有⼀个⾝份证号 ⼀个⾝份证号只能属于⼀个⼈ (4)⽼师和学⽣之间就是多对多 ⼀个学⽣可以被多个⽼师教过 ⼀个⽼师可以交多个学⽣2.mybatis中的多表查询⽰例:⽤户和账户 ⼀个⽤户可以有多个账户 ⼀个账户只能属于⼀个⽤户(多个账户也可以属于同⼀个⽤户)步骤: 1、建⽴两张表:⽤户表,账户表 让⽤户表和账户表之间具备⼀对多的关系:需要使⽤外键在账户表中添加 2、建⽴两个实体类:⽤户实体类和账户实体类 让⽤户和账户的实体类能体现出来⼀对多的关系 3、建⽴两个配置⽂件 ⽤户的配置⽂件 账户的配置⽂件 4、实现配置: 当我们查询⽤户时,可以同时得到⽤户下所包含的账户信息 当我们查询账户时,可以同时得到账户的所属⽤户信息3.@Results注解⽤法总结:MyBatis中使⽤@Results注解来映射查询结果集到实体类属性。

(1)@Results的基本⽤法。

当数据库字段名与实体类对应的属性名不⼀致时,可以使⽤@Results映射来将其对应起来。

column为数据库字段名,porperty为实体类属性名,jdbcType为数据库字段数据类型,id为是否为主键。

@Select({"select id, name, class_id from my_student"})@Results({@Result(column="id", property="id", jdbcType=JdbcType.INTEGER, id=true),@Result(column="name", property="name", jdbcType=JdbcType.VARCHAR),@Result(column="class_id", property="classId", jdbcType=JdbcType.INTEGER)})List<Student> selectAll();如上所⽰的数据库字段名class_id与实体类属性名classId,就通过这种⽅式建⽴了映射关系。

hibernate核心,一对多,多对多映射讲解,看了就完全搞明白了

hibernate核心,一对多,多对多映射讲解,看了就完全搞明白了
• 增加山南区下属的三个街道:“和平路” 、“八一路”和“五四大道”
在many一方删除数据1
• 删除“五四大道”
inverse设为true,由many一方删除 从one一方去“删除”, Hibernate只是执行了 问题出在配置文件上 update语句。还是未删 没有配置set节点的inverse属性 除成功! 根本没有执行 Delete语句,数据 没有被删除!
– 配置Hibernate多对多关联,实现某OA系统项 目和人员对照关系的管理
本章目标
• 掌握单向many-to-one关联 • 掌握双向one-to-many关联 • 掌握many-to-many关联
实体间的关联
• 单向多对一
tblJd.getQx().getQxname();
• 单向一对多
TblJd jd = (TblJd)tblQx.getJds().get(0); jd.getJdname(); tblQx.getJds.add(jd);
小结
• 在租房系统中,房屋信息(Fwxx)与用户 (User)间也是多对一关系。如何配置映 射文件,使之可以通过下面的代码输出房 屋信息和发布该信息的用户名称? Fwxx fwxx = (Fwxx)super.get(Fwxx.class,1);
System.out.println( fwxx.getTitle() + "," + fwxx.getUser.getUname());
inverse是“反转”的意思,表示关联关系的控制权。 为true,表示由对方负责关联关系的添加和删除; 执行了delete语句, 为false,表示由自己负责维护关联关系。 删除成功
• 在many一方删除数据的正确做法:

Hibernate总结PPT教学课件

Hibernate总结PPT教学课件
Hibernate数据加载方式
1、即时加载 lazy=“false”; 2、延迟加载 lazy=“ture”; 特点:在需要使用时对数据进行加载,节约资源
HQL联表查询中fetch的使用 本地SQL查询
1、在实体映射文件中编写
2、在项目中进行调用
2020/12/11
9
第5章:Criteria查询
Hibernate学习总结
2020/12/11
1
第1章: Hibernate入门
数据持久化ORM 在项目中使用Hibernate
2020/12/11
2
数据持久化ORM
ORM(Object Relationship Mapping)
内存
Hibernate 项目
ORM
数据库
2020/12/11
3
2020/12/11
6
第3章: HQL实用技术
使用HQL语句的步骤:
1、得到Session 2、编写HQL语句 3、创建Query对象 4、执行查询
HQL中占位符的使用
1、使用‘?’占位符 为占位符设值 eq: query. setType(index,value); index从0开始 2、命名参数占位符 “:”后面必须为实体类的属性 设置值: QueryProperities qp = new QueryProperities();
Criteria查询
原理:根据实体类的类型进行查询 Criteria查询时条件设置:使用add()方法 1、 使用Restriction
Restriction. le(“实体类对象属性”,值) //小于 Restriction. ge(“实体类对象属性”,值) //大于 2、使用Example(将对象中不为空的属性作为条件) 将条件封装到实体对象,在使用该对象查询 Example. create(实体类对象);

hibernate最精细总结 java

hibernate最精细总结 java

Hibernate总结注:重点讲解关联映射总结人:张焕邮箱:zhang343489603@欢迎交流讨论。

目录1)核心接口简介2)Hibernate版本更新情况3)Hibernate关联映射4)简单属性查询5)Hibernate与延迟加载6)hibernate 中Criteria 的使用介绍7) Hibernate程序性能优化Hibernate优点:1、封装了jdbc,简化了很多重复性代码。

2、简化了DAO层编码工作,使开发更对象化了。

3、移植性好,支持各种数据库,如果换个数据库只要在配置文件中变换配置就可以了,不用改变hibernate代码。

4、支持透明持久化,因为hibernate操作的是纯粹的(pojo)java类,没有实现任何接口,没有侵入性。

所以说它是一个轻量级框架。

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web 应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。

1)核心接口简介:Hibernate的核心接口一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。

这6个核心接口在任何开发中都会用到。

通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。

下面对这6个核心接口分别加以介绍。

Session接口Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。

)。

但需要注意的是Session对象是非线程安全的。

同时,Hibernate的session不同于JSP应用中的HttpSession。

13-Hibernate关联关系映射:一对多孤儿删除

13-Hibernate关联关系映射:一对多孤儿删除

13-Hibernate关联关系映射:⼀对多孤⼉删除persist和merge是JPA提供的内容none是不使⽤级联,save-update是保存和更新的时候级联hibernate级联的取值none:不使⽤级联save-update:保存和更新时级联delete:删除的时候级联all:delete-orphan:孤⼉删除,孤⼦删除*仅限于⼀对多,只有⼀对多的时候才有类似⽗⼦关系的存在,才有⽗⼦表的存在。

认为⼀的⼀⽅是⽗⽅。

因为⼀个⽗亲是可以有多个孩⼦的。

多的⼀⽅是⼦的⼀⽅。

*当⼀个客户与某个订单解除关系,其实就是将外键置为null,如果你的订单没有所属的客户,那你的订单还有意义吗?订单没有了所属客户,就相当于⼀个孩⼦没有了⽗亲,将这种记录就删除了,这就叫做孤⼉删除。

*但是这只有在⼀对多的情况下才存在。

多对多的情况哪有这种关系,多对多就是多个⽗亲多个⼉⼦,这就不合理了。

⼀的⼀⽅是⽗⽅,多的⼀⽅是⼦⽅。

All-delete-orphan:我们现在想让1号客户和1号订单解除关系:⼀个部门可以有多个员⼯,⼀个员⼯只能属于⼀个部门。

解除关系就是把外键置为空了,就是把外键置为null了。

Hibernate:selectcustomer0_.cid as cid0_0_,customer0_.cname as cname0_0_fromcustomer customer0_wherecustomer0_.cid=?Hibernate:selectorder0_.oid as oid1_0_,order0_.addr as addr1_0_,order0_.cno as cno1_0_fromorders order0_whereorder0_.oid=?Hibernate:selectorders0_.cno as cno0_1_,orders0_.oid as oid1_,orders0_.oid as oid1_0_,orders0_.addr as addr1_0_,orders0_.cno as cno1_0_fromorders orders0_whereorders0_.cno=?Hibernate:updateorderssetcno=nullwherecno=?这个时候我们再看客户和订单都还在。

关系映射

关系映射
单向关联Person----->IdCard
T_person --------------------------------------Id name --------------------------------------1 张三 2 李四 T_idCard --------------------------------------Id cardNo --------------------------------------1 1234567890 2 2345678901
One2One fk1
<class name="com.sinoest.hibernate.IdCard" table="t_idCard"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> </class>
many2one
public class User { private int id; private String name; private String name; private Group group; public int getId() { return id; } …. } } public int getId() { return id; } public void setId(int id) { this.id = id; } …. Public class Group{ prlass Classes { private int id; private String name; private Set students; public int getId() { return id; } public void setId(int id) { this.id = id; } ……. public class Student { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Hibernate(6)——一对多和多对多关联关系映射(xml和注解)总结涉及的知识点总结如下:∙One to Many 映射关系o多对一单向外键关联(XML/Annotation)o一对多单向外键关联(XML/Annotation)o懒加载和积极加载o一对多双向外键关联(XML/Annotation)∙Many to Many 映射关系o多对多单向外键关联(XML/Annotation)o多对多双向外键关联(XML/Annotation)o set的inverse元素详解∙问题小结∙关联关系的优缺点多对一单向外键关联关系注意多对一关联是多方持有一方的引用。

看一个例子,去淘宝购物,那么一个淘宝用户可以对应多个购物订单,如图所示:多的一方是Orders,持有一方的引用,也就是Users,而在Users中无需作任何定义,从订单到用户的关系是单向多对一关联。

对应数据库就是:还有比如说学生和班级的关系,多个学生可以属于同一个班级,这就是从学生到班级也是典型的单向多对一关系,看代码实现:基于注解的多对一单向外键关联:单向多对一关联中,多方需要持有一方的引用,那么多方(学生类)需要额外配置,需要对持有的一方引用使用注解@ManyToOne (cascade={CascadeType.ALL}, fetch=FetchType.EAGER),设置为级联操作和饥渴的抓取策略,@JoinColumn(name="cid"),而一方(教室类)无需做任何多方的定义。

注意;多方必须保留一个不带参数的构造器!importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;//班级类,在多对一关系中属于一的方,不持有其他多余的配置,反而是被多方持有@Entitypublic class ClassRoom {private intcid;//班级编号private String cname;//班级名称// 自动增长的主键@Id@GeneratedValuepublicintgetCid() {returncid;}public void setCid(intcid) {this.cid = cid;}public String getCname() {returncname;}public void setCname(String cname) {ame = cname;}}View Code一方——班级类无需做多余的定义,下面是多方——学生实体和配置:importjavax.persistence.CascadeType;importjavax.persistence.Entity;importjavax.persistence.FetchType;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;importjavax.persistence.JoinColumn;importjavax.persistence.ManyToOne;//学生实体类,属于多对一的多方,持有班级(一方)的引用@Entitypublic class Students {private intsid; //编号private String sname; //姓名private ClassRoom classroom;//学生班级//注意:多方一定要显式的定义不带参数的构造方法public Students() {}public Students(String sname){this.sname = sname;}// 多方使用注解:@ManyToOne// fetch=FetchType.EAGER,急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。

// 全部级联操作,referencedColumnName显式设置数据库字段名cid,不写默认就是和name一样的。

@ManyToOne (cascade={CascadeType.ALL}, fetch=FetchType.EAGER)@JoinColumn(name="cid",referencedColumnName="cid") publicClassRoomgetClassroom() {return classroom;}public void setClassroom(ClassRoom classroom) {this.classroom = classroom;}// 自动增长主键@Id@GeneratedValuepublicintgetSid() {returnsid;}public void setSid(intsid) {this.sid = sid;}public String getSname() {returnsname;}public void setSname(String sname) {this.sname = sname;}}View Code下面测试:先生成数据库脚本,再进行学生对象的插入public class TestStudentsByAnno {private static SessionFactorysessionFactory;@Beforepublic void setUp() throws Exception {System.out.println("setUp()...");sessionFactory = newAnnotationConfiguration().configure().buildSessionFactory(); }@Afterpublic void tearDown() throws Exception {System.out.println("tearDown()...");sessionFactory.close();}@Testpublic void testSave() {Session session = sessionFactory.getCurrentSession(); Transaction tx = session.beginTransaction();try {ClassRoom c = new ClassRoom();c.setCname("computer001");Students s = new Students("zhangsan");s.setClassroom(c);session.save(s);mit();} catch(Exception ex) {ex.printStackTrace();tx.rollback();}}@Test@Ignorepublic void testSchemaExport() {SchemaExport se = new SchemaExport(newAnnotationConfiguration().configure());se.create(true, true);}}View Code反向创建表的数据库脚本如下:create table ClassRoom (cid integer not null auto_increment, cnamevarchar(255), primary key (cid))create table Students (sid integer not null auto_increment, snamevarchar(255), cid integer, primary key (sid))插入一个学生对象,会自动生成如下语句:ClassRoom c = new ClassRoom();c.setCname("computer001");Students s = new Students("zhangsan");s.setClassroom(c);session.save(s);mit();View CodeHibernate: insert into ClassRoom (cname) values (?)Hibernate: insert into Students (cid, sname) values (?, ?)插入成功:基于xml配置实现多对一单向外键关联<hibernate-mapping><class name="net.nw.vo.fk.mto.ClassRoom" table="classroom"><id name="cid" column="cid" type="int"><generator class="native"/></id><property name="cname" column="cname" type="string"/></class></hibernate-mapping>View Code一方(教室类)无需做任何多方的定义。

只需要维护好自己的属性配置即可。

而多方只需要加上<many-to-one name="" column=“"/>就ok。

<hibernate-mapping><class name="net.nw.vo.fk.mto.Students" table="students"><id name="sid" column="sid" type="int"><generator class="native"/></id><property name="sname" column="sname" type="string"/><many-to-one name="classroom" column="cid"/></class></hibernate-mapping>View Codehibernate.cfg.xml里加上<mapping resource="net/nw/vo/fk/mto/ClassRoom.hbm.xml" /><mapping resource="net/nw/vo/fk/mto/Students.hbm.xml" />View Code注意:如果没有设置级联ALL,那么需要在保存的时候先保存班级,在保存学生,否则出错: object references an unsaved transient instance - save the transient instance before flushing:ClassRoomclassRoom = new ClassRoom();classRoom.setCname("CS");Students students = new Students("111");students.setClassroom(classRoom);session.save(classRoom);session.save(students);mit();View Code小结:使用<many-to-one>元素进行多对一关联关系配置,name属性指定类的属性名,column 属性指定库表字段名,class属性指定类属性类型(加上姓,即包名),not-null属性指定属性是否允许为空,cascade属性指定是否级联保存和更新:save-update、delete、all、none。

相关文档
最新文档