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

合集下载

Hibernate关系映射笔记

Hibernate关系映射笔记

2015年10月12日Hibernate笔记----Day4映射文件总结:(多对一、一对多、一对一、多对多)多对一:新建项目---引包---加包1、编写Java类,指明属性,生成get和set方法1)将n的一端类名属性加到1的一端。

2)1的一端无变化。

2、生成配置文件*.hbm.xml1)选中Java文件右键---new----other----"输入Hibernate"---选择Hibernate XML Maping2) 改:generator class="native"3)1的一端无变化,n的一端加入many-to-one如:<many-to-one name="customer"class="qjnu.wdw.day3.Customer"><column name="CUSTOMER_RK" /></many-to-one>(其中,name 必须与Customer.java中属性一致)3、添加关联的hibernate 映射文件*.hbm.xml如:<mapping resource="qjnu/wdw/day3/Customer.hbm.xml"/>4、测试类中先保存1的一端,再保存n的一端。

一对多:新建项目---引包---加包1、编写Java类,指明属性,生成get和set方法1)将n的一端类名属性加到1的一端。

2)1的一端加入n端的集合属性。

例如:private Set<Order> orders = new HashSet<>();2、生成配置文件*.hbm.xml1)选中Java文件右键---new----other----"输入Hibernate"---选择Hibernate XML Maping2) 改:generator class="native"3)1的一端加入one-to-many如:<set name="orders" table="ORDERS" inverse="true" cascade="all"> <key column="CUSTOMER"></key><one-to-many qjnu.wdw.day3.Order/></set>(其中,name 属性保持一致)n的一端加入many-to-one如:<many-to-one name="customer" class="qjnu.wdw.day3.Customer" ><column name="CUSTOMER" /></many-to-one>3、添加关联的hibernate 映射文件*.hbm.xml如:<mapping resource="qjnu/wdw/day3/Customer.hbm.xml"/>4、测试类中先保存1的一端,再保存n的一端。

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

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

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,急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。

Hibernate关联映射(多对一和一对多)

Hibernate关联映射(多对一和一对多)

共性问题集中讲解
常见问题及解决办法 代码规范问题 调试技巧
共性问题集中讲解
映射一对一关联关系的方法:
按照外键映射 按照主键映射。
Session管理缓存的方法:
evict() clear()方法。
批量处理的方法:
通过HQL进行批量操作 通过JDBC API进行批量操作 通过Session进行批量操作。
提示:
需要搭建openSessionInView模式 按步骤配置二级缓存和查询缓存
完成时间:20分钟
共性问题集中讲解
常见问题及解决办法 代码规范问题 调试技巧
共性问题集中讲解
HQL的连接查询
和SQL查询一样,HQL也支持各种各样的连接 查询,如内连接、外连接。
连接类型 内连接 迫切内连接 左外连接 迫切左外连接 右外连接
<generator class="afosrseigignne"d>" />
</id><param name="property">resume2</param>
<p<ro/gpeenrteyrantaomr>e="resname" type="ng.String">
</<idc>olumn name="RESNAME" length="40">
<p<rocopleurmtynnnaammee==""uRseESrnCaAmRDe"NtOy"pele=n"gjathva=."l4an0"g>.String">

Hibernate_关联关系(多对一和一对多)理论

Hibernate_关联关系(多对一和一对多)理论
5/29
关联关系
类与类之间最普遍的关系就是关联关系
单向的关联 双向的关联
6/29
多对一单向关联关系
配置从Emp到Dept的多对一单向关联
Dept持久化类 Emp持久化类
Dept.hbm.xml
Emp.hbm.xml
<clapsusbnlicamclea=s"scDn.ejbpitt.ihmibpelermnaetnetdseSmeor.ieanlitziatyb.lDEeme{ppt" table="edmeppt"">> <pidrivnaatme eB=y"tdeemedppetNpotN"oc;olumn="EDMEPTNNOO" "tytpypee=="j"ajavava.l.alanngg.I.nBteygtee"r>"> pr<igvaetneeSrattroinrgcldaespst=N"aamssei;gned"/> <p/irdiv>ate String location;
13/29
共性问题集中讲解
常见问题及解决办法 代码规范问题 调试技巧
共性问题集中讲解
14/29
学员操作——配置一对多双向关联
需求说明
配置区县到街道的双向的一对多 添加区县级联添加该区县下的两个街道 设置区县的inverse属性值为true,修改某区县, 从该区县中移走某一街道。 设置区县的<set>元素的order-by属性为:按照街 道编号倒叙排序
更新所有关联的游离状态的对象。
delete
当通过Session的delete()方法删除当前对象时,会 级联删除所有关联的对象。

hibernate之映射文件VS映射注解

hibernate之映射文件VS映射注解

hibernate之映射⽂件VS映射注解前⾔ 对于java开发者⽽⾔,注解应该不是⼀个陌⽣的概念,早在JavaSE阶段,例如@Override标记重写⽗类⽅法或实现接⼝⽅法,@Test标记单元测试⽅法,所以我们可以简单地把它理解为⼀种有特殊含义的标记...在开发过程中,我们还可以⽤注解⽅式替代配置⽂件实现相关功能,例如Java web开发中,3.0版本后,利⽤@WebServlet、@WebListener等注解分别可以替代web项⽬XML配置⽂件中相关内容。

⽽本⽂中讲述的就是Hibernate的映射配置⽂件与映射注解的对⽐,这两种⽅式均可以实现映射功能,为了避免先⼊为主,在此先不阐述孰优孰劣,接下来以实体类基本映射⽰例,分别⽤配置⽂件和注解⽅式实现。

hibernate.cfg.xml配置⽂件在使⽤两种⽅式时的变动<?xml version="1.0"?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!-- 以下四⾏分别为:数据库驱动类、Drivermanager获取连接的参数URL、⽤户名、密码 --><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="connection.url">jdbc:mysql://127.0.0.1/web?characterEcoding=utf-8</property><property name="ername">root</property><property name="connection.password">123456</property><!-- 设置⽅⾔,hibernate会根据数据库的类型相应⽣成SQL语句 --><property name="dialect">org.hibernate.dialect.MySQLDialect</property><!-- 1.使⽤映射⽂件时 --><!-- 映射配置源⽂件的位置 --><mapping resource="demo/pojo/Person.hbm.xml"/><!-- 2.使⽤映射注解时 --><!-- 注册关系映射类 --><mapping class="demo.pojo.Person" /></session-factory></hibernate-configuration>实体类映射背景:数据库中⼀个⽤户表person,字段四个,包涵⾃增主键id、姓名name、性别sex、年龄age,映射实体类为Person,属性四个,id、name、gender、age。

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注解(一对一、一对多、多对多)

Hibernate注解(一对一、一对多、多对多)

Hibernate注解(⼀对⼀、⼀对多、多对多)JPA(Java Persistence API)通过注解或XML描述对象与关系表的映射关系,并将运⾏期的实体对象持久化到数据库中。

JPA是⼀个规范,是⼀个标准,Hibernate是实现了这个标准的开源框架。

1、引⼊hibernate-jpa-2.0-api-1.0.0.Final.jar JPA规范对应的hibernate的jar包2、修改配置⽂件hibernate.cfg.xml 的映射关系<Mapping class=""><?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-configurationPUBLIC "-//Hibernate/Hibernate Configuration DTD//EN""/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!-- thread:⼀个线程中使⽤⼀个。

获取session会话时使⽤--><property name="current_session_context_class">thread</property><!-- 是否显⽰SQL语句,值为布尔型,默认false --><property name="hibernate.show_sql">true</property><!-- 是否格式化显⽰sql语句,让显⽰更美观,值为布尔型,默认false --><property name="hibernate.format_sql">false </property><!-- ⾃动建表update:每次执⾏时,⽆表则建表,⽆列则建列,只增不减create:每次启动的时候,删除原表,再次创建create-drop:每次启动时创建新表,当显式关闭sessionFactory时,删除表--><property name="hibernate.hbm2ddl.auto">update</property><!-- 连接数据库 --><property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/zxd_db</property><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="ername">zxd</property><property name="hibernate.connection.password">123456</property><property name="dialect">org.hibernate.dialect.MySQLDialect</property><!-- 读取注解 --><mapping class="demo.entity.Book"/></session-factory></hibernate-configuration>3、实体配置package demo.entity;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Table;import org.hibernate.annotations.GenericGenerator;/*** 注解实体配置* JPA通过注解或XML描述对象与关系表的映射关系,并将运⾏期的实体对象持久化到数据库中。

Hibernate一对多、一对一、多对多映射之xml篇

Hibernate一对多、一对一、多对多映射之xml篇

一、一对多/多对一1.确定谁是一方,谁是多方。

某表的主键在另一表中为外键,则某表为一方。

如学生和班级的对应关系,一个班级对应多个学生,所以班级为一方,学生为多方。

2.一方和多方po中部分代码的书写ClassInfo一方:set<多方类型> 的属性代码如:private Set<Student> stuSet;Student多方:一方类型的属性注意:不写外键字段。

代码如:private ClassInfo classInfo;3、配置ClassInfo一方:<set name="student" > 子元素:<key column="哪个字段是别人的外键(class_id)" /> <one-to-many class=”Student”></set>Student多方:<many-to-one name="classInfo" class="ClassInfo"column="class_id" >4、测试添加记录时的dao一部分代码ClassInfo c=new ClassInfo();c.setCname("aaa");Student s=new Student();s.setStuName("gsc");s.setAge(12);s.setEmail("gsc@");Set<Student> stuSet=new HashSet<Student>();stuSet.add(s);c.setStuSet(stuSet);Session session = HibUtil.getSession();Transaction tx = session.beginTransaction();session.save(c);mit();session.close();二一对一1.外键关联:一对多的基础上在外键字段上加个唯一约束构成1对1的关系。

  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"),而一方(教室类)无需做任何多方的定义。

注意;多方必须保留一个不带参数的构造器!
import ;
import ;
import ;
//班级类,在多对一关系中属于一的方,不持有其他多余的配置,反而是被多方持有
public class ClassRoom {
private int cid;//班级编号
private String cname;//班级名称
// 自动增长的主键
@Id
@GeneratedValue
public int getCid() {
return cid;
}
public void setCid(int cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
ame = cname;
}
}
View Code
一方——班级类无需做多余的定义,下面是多方——学生实体和配置:
import ;
import ;
import ;
import ;
import ;
import ;
import ;
//学生实体类,属于多对一的多方,持有班级(一方)的引用@Entity
public class Students {
private int sid; //编号
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")
public ClassRoom getClassroom() {
return classroom;
}
public void setClassroom(ClassRoom classroom) {
this.classroom = classroom;
}
// 自动增长主键
@Id
@GeneratedValue
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
}
View Code
下面测试:先生成数据库脚本,再进行学生对象的插入
public class TestStudentsByAnno {。

相关文档
最新文档