Hibernate关联关系映射介绍及其相应的应用示例
- 格式:doc
- 大小:521.00 KB
- 文档页数:58
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(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@GeneratedValuepublic 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 ;//学生实体类,属于多对一的多方,持有班级(一方)的引用@Entitypublic class Students {private int sid; //编号private String sname; //姓名private ClassRoom classroom;//学生班级//注意:多方一定要显式的定义不带参数的构造方法public Students() {public Students(String sname){this.sname = sname;}// 多方使用注解:@ManyToOne// fetch=FetchType.EAGER,急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。
框架学习之Hibernate 第六节关系映射学习各种映射关系时总结:①如何将对象之间的关联关系映射到数据库中②如何检索出关联对象 1.多对一映射它是用法最多的映射关系,性能上占有优势关系模型和对象模型:两者并不是一一对应的举个例子:告知员工属于哪个部门和告知部门有哪些员工对于数据库(关系模型)来说只要有一个就可以但是对于对象模型不是如此,告知员工属于哪个部门之后,部门并不会知道自己有哪些员工 2.一对多映射它的关系模型和上面一样,也就是表的结构并不转变,但是对象模型转变了 3.一对一映射主对象和从对象主对象假如没有从对象可以,但是从对象没有主对象是不可的查找主对象时只用了一条sql语句,用法了outer 查找从对象时用了两条语句,首先查从对象,然后查主对象(假如要用法从对象对应的主对象)两种映射办法:①基于主键的一对一②基于外键的一对一 4.多对多映射用法的不是无数,要注重数据量的大小对性能的影响,由于多对多需要查三张表 5. 组件映射当一个类的属性很特别,不是数据库中支持的类型,而且又算不上是一个实体,没有表与之对应时可以用法组件映射假如组件的属性不能和表中的字段容易对应的时候可以挑选用法自定义用户类型! 6.关系映射的总结①对于关联关系的查询,Hibernate普通都是用法两条sql语句将它查出来,但是一对一的状况里的查主对象例外,它是一条sql 7.集合映射xml – Java集合类型 - 特点 xml中需要配置的信息:- Set 没有重复,不保存加入的挨次array:- Class[] 有挨次的 list-indlist:- List 可以重复,有挨次的 list-indexbag:- List 不保存挨次的List list-indexmap:- Map map键值对的映射类型 map-key编写 xml 办法用法原则:多数状况下都是用法set,需要保证挨次用法list,但是想用List而又不需要保证挨次用法bag 注重点:①定义成 Set,而不是 HashSet②本来是 HashSet,保存了之后就不再是 HashSet 了,强制转型时会报错的!缘由是Hibernate举行的封装,变成了PersitentSet,实现了 Set 接口,但是和 HashSet 没有关系,不能第1页共2页。
hibernate关联映射详解一对多关系 1.一对多关系(单向):在一端映射文件中加入:name= student keyumn= classes / one-to-many > /set 2.一对多关系(双向):(1).在一端映射文件中加入: setname= student keycolumn= classesid / one-to-many > /set (2).在多的一端加入: many-to-onename= classes column=classesid /many-to-one 多对一关系在多的一端加入:many-to-one name= classes column= classesid / 一对一关系 1. 一对一外键关联单向:(它其实就是一个多对一映射的一个特例,只是设置ue=”ue”)在维护关系一端的映射文件中加入:many-to-onename= card unique= true cascade= all /many-to-one 双向:在维护关系一端的映射文件中加入: many-to-onename= card unique= true cascade= all /many-to-one 在另一段的映射文件中加入: one-to-onename= users property-ref= card /one-to-one 因为 one-to-one name 标签默认是找关联主键,所以在这里需要property-ref= card 配置关联属性。
Cascade属性是级联的意思。
2. 一对一主键关联 a) 单向在维持关系一端的代码: classname= er_pk idname= id generator > paramname= property card_pk /param /generator /id propertyname= name unique= true /property one-to-onename= card_pk constrain= true /one-to-one /class 设置generator > constrained= true 设置该实体的主键是card_p的外键。
数据库采用外键来描述数据表之间的关系(1)一对多:客户和订单的关系创建customers、orders数据表在多方添加一方的外键(在orders表添加customer_id)(2)一对一:公司和公司收信地址关系创建company和address 数据表在任意一方添加对方的主键作为外键(3)多对多:订单和商品的关系创建orders和products数据表必须创建第三张(即中间表)关系表,分别引入双方的主键作为外键Hibernate是采用Java对象关系来描述数据表实体之间的关系:多对一的映射关系:* name:设定待映射的持久化类的名字。
* column:设定和持久化类的属性对应的表的外键。
* class:设定持久化类的属性的类型。
* not-null:是否允许为空。
一对多映射关系:name :设定Customer中集合类型属性名称<key column :设置生成数据表中外键字段名称not null :设置外键字段非空约束<one-to-many > :设置一对多映射关系class :设置映射关联目标PO类在对象–关系映射文件中, 用于映射持久化类之间关联关系的元素, <set>, <many-to-one> 和<one-to-one> 都有一个cascade (级联操作)属性, 它用于指定如何操纵与当前对象关联的其他对象.单向维护:(inverse)通过inverse属性来设置由双向关联的哪一方来维护表和表之间的关系.inverse=false 的为主动方,inverse=true 的为被动方, 由主动方负责维护关联关系在one一方设置inverse=true,由集合端管理关系。
多对多关系:多对多的实体关系模型也是很常见的,比如学生和课程的关系。
一个学生可以选修多门课程,一个课程可以被多名学生选修。
在关系型数据库中对于多对多关联关系的处理一般采用中间表的形式,将多对多的关系转化成两个一对多的关系。
Hibernate关联关系映射介绍及其相应的应用示例Hibernate关联关系映射目录│├─单向关联│├─一对一外键单向关联│├─一对一主键单向关联│├─一对一连接表单向关联│├─一对多外键单向关联│├─一对多连接表单向关联│├─多对一外键单向关联│├─多对一连接表单向关联│└─多对多单向关联└─双向关联├─一对一外键双向关联├─一对一主键双向关联├─一对一连接表双向关联├─一对多外键双向关联├─一对多连接表双向关联└─多对多双向关联本系列实例的开发环境:Windows XP Professional 简体中文版MySQL 5.0.45Hibernate 3.12Java SDK 1.5.06系列实例中所用的Hibernate配置文件如下:<?xml version='1.0' encoding='gb2312'?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""[url]/hibernate-configuration-3.0.dtd[/url]"><hibernate-configuration><session-factory><!--指定连接数据库驱动--><property name="connection.driver_class">com.mysql.jdbc.Driver</property><!--指定连接数据库的url,hibernate连接的数据库名--><property name="connection.url">jdbc:mysql://localhost:3306/hbstudy</property> <!--指定连接数据库的用户名--><property name="ername">root</property><!--指定连接数据库的用户密码--><property name="connection.password">123456</property><!--指定连接池的大小--><property name="connection.pool_size">5</property><!--指定数据库的方言--><property name="dialect">org.hibernate.dialect.MySQLDialect</property><!--根据需要自动创建数据库,测试环境用--><property name="hbm2ddl.auto">create</property><!--在控制台显示执行的SQL语句--><property name="show_sql">true</property><!-- Enable Hibernate's automatic session context management --><property name="current_session_context_class">thread</property><!--映射文件列表--><!--单向关联--><mapping resource="com/lavasoft/dx/_n_1_fk/Addressn1fk.hbm.xml"/><mapping resource="com/lavasoft/dx/_n_1_fk/Personn1fk.hbm.xml"/><mapping resource="com/lavasoft/dx/_n_1_tab/Addressn1tab.hbm.xml"/><mapping resource="com/lavasoft/dx/_n_1_tab/Personn1tab.hbm.xml"/><mapping resource="com/lavasoft/dx/_1_1_fk/Address11fk.hbm.xml"/><mapping resource="com/lavasoft/dx/_1_1_fk/Person11fk.hbm.xml"/><mapping resource="com/lavasoft/dx/_1_1_tab/Address11tab.hbm.xml"/><mapping resource="com/lavasoft/dx/_1_1_tab/Person11tab.hbm.xml"/><mapping resource="com/lavasoft/dx/_1_1_pk/Address11pk.hbm.xml"/><mapping resource="com/lavasoft/dx/_1_1_pk/Person11pk.hbm.xml"/><mapping resource="com/lavasoft/dx/_1_n_fk/Address1nfk.hbm.xml"/><mapping resource="com/lavasoft/dx/_1_n_fk/Person1nfk.hbm.xml"/><mapping resource="com/lavasoft/dx/_1_n_tab/Address1ntab.hbm.xml"/><mapping resource="com/lavasoft/dx/_1_n_tab/Person1ntab.hbm.xml"/><mapping resource="com/lavasoft/dx/_n_n/Addressnn.hbm.xml"/><mapping resource="com/lavasoft/dx/_n_n/Personnn.hbm.xml"/><!--双向关联--><mapping resource="com/lavasoft/sx/_1_n_fk/Address1nfk_sx.hbm.xml"/><mapping resource="com/lavasoft/sx/_1_n_fk/Person1nfk_sx.hbm.xml"/><mapping resource="com/lavasoft/sx/_1_n_tab/Address1ntab_sx.hbm.xml"/><mapping resource="com/lavasoft/sx/_1_n_tab/Person1ntab_sx.hbm.xml"/><mapping resource="com/lavasoft/sx/_n_n/Addressnn_sx.hbm.xml"/><mapping resource="com/lavasoft/sx/_n_n/Personnn_sx.hbm.xml"/><mapping resource="com/lavasoft/sx/_1_1_fk/Address11fk_sx.hbm.xml"/><mapping resource="com/lavasoft/sx/_1_1_fk/Person11fk_sx.hbm.xml"/><mapping resource="com/lavasoft/sx/_1_1_pk/Address11pk_sx.hbm.xml"/><mapping resource="com/lavasoft/sx/_1_1_pk/Person11pk_sx.hbm.xml"/><mapping resource="com/lavasoft/sx/_1_1_tab/Address11tab_sx.hbm.xml"/><mapping resource="com/lavasoft/sx/_1_1_tab/Person11tab_sx.hbm.xml"/> </session-factory></hibernate-configuration>系列实例中所用到Session工厂是:public class HibernateUtil {private static final SessionFactory sessionFactory;static {try {// Create the SessionFactory from hibernate.cfg.xmlsessionFactory = new Configuration().configure().buildSessionFactory();} catch (Throwable ex) {// Make sure you log the exception, as it might be swallowedSystem.err.println("初始化SessionFactory失败!" + ex);throw new ExceptionInInitializerError(ex);}}public static final ThreadLocal session = new ThreadLocal();public static Session getCurrentSession() throws HibernateException {Session s = (Session) session.get();//当原Session为空或已关闭时,打开一个新的Sessionif (s == null || !s.isOpen()) {s = sessionFactory.openSession();session.set(s);}return s;}public static void closeSession() throws HibernateException {Session s = (Session) session.get();session.set(null);if (s != null) {s.close();}}}Hibernate关联关系映射介绍及其相应的应用示例Hibernate关联关系映射目录│├─单向关联│├─一对一外键单向关联│├─一对一主键单向关联│├─一对一连接表单向关联│├─一对多外键单向关联│├─一对多连接表单向关联│├─多对一外键单向关联│├─多对一连接表单向关联│└─多对多单向关联└─双向关联├─一对一外键双向关联├─一对一主键双向关联├─一对一连接表双向关联├─一对多外键双向关联├─一对多连接表双向关联└─多对多双向关联Hibernate 一对一外键单向关联事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似。