热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Oracle培训(三十七)——深入解析Hibernate第三章:实体关联关系映射详解

在本节Oracle培训中,我们将深入探讨Hibernate第三章的内容,重点讲解实体关联关系映射的详细知识点。首先,回顾了Hibernate的基本概念和映射基础,随后详细分析了不同类型的实体关联关系,包括一对一、一对多和多对多关系的映射方法及其应用场景。通过具体的示例和代码片段,帮助读者更好地理解和掌握这些复杂的映射技术。此外,还讨论了如何优化关联关系的性能,以及常见的问题和解决方案。

Oracle培训(三十七)——Hibernate第三章知识点总结——第三章--实体关联关系映射


Hibernate基础回顾

Hibernate映射基础

Hibernate-mapping/class/id/generator/property

Hibernate ID生成器

Hibernate内置ID生成器、自定义ID生成器

Hibernate数据类型

基本数据类型、JDBC数据类型、自定义数据类型

Hibernate对象生命周期

三种状态特征、区分、转换,持久态对象特性

目标

理解各个关联关系映射中数据建模

掌握并熟练应用一对一关联

掌握并熟练应用一对多关联

掌握并熟练应用多对多关联

知识点预览

ORM映射规则

一对一关联

一对多关联

多对多关联


ORM映射规则

1. 映射概述

a) /表映射

b) 属性/字段映射

c) Map class associations to tables’ foreign key relationships

1:1/1:m/m:n

d) Map objects (instances of classes) to table rows

一对一关联

1. 一对一关联包括两种实现形式:

a) 唯一外键关联

b) 共享主键关联

2. 唯一外键关联

a) 唯一外键关联的一对一关系只是一对多关系的一个特例;

b) 唯一外键的实现是通过一方的主键作为另一方关联表的外键,并对外键做唯一性限制;

3. 唯一外键关联样例—数据模型

4. 唯一外键关联样例—POJO类片段

package com.oracle.entity;public class Order {
private Integer Id;
private String name;
private Integer cost;
private Date createdDate;
private Address addr;
public Address getAddr() {return addr;
}
public void setAddr(Address addr) {this.addr = addr;
}
}package com.oracle.entity;public class Address {
private Integer Id;
private String street;
private String city;
private String zip;
private Order order;
public Order getOrder() {return order;
}
public void setOrder(Order order) {this.order = order;
}
}


5. 唯一外键关联样例—映射配置文件


"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">






cascade="all">


"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">









6. 唯一外键关联样例-摘要

7. 共享主键关联

a) 如果两张表是通过这种一对一关系相关联的,那么这两张表就共享同样的主关键字值

b) Hibernate中,通过one-to-one节点对一对一关系进行定义

8. 主键关联样例—数据模型

9. 共享主键关联样例—POJO类片段

package com.oracle.entity;public class Order {
private Integer Id;
private String name;
private Integer cost;
private Date createdDate;
private Address addr;
public Address getAddr() {return addr;
}
public void setAddr(Address addr) {this.addr = addr;
}
}package com.oracle.entity;public class Address {
private Integer Id;
private String street;
private String city;
private String zip;
private Order order;
public Order getOrder() {return order;
}
public void setOrder(Order order) {this.order = order;
}
}


10. 共享主键关联样例—映射配置文件


"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">





cascade="all">


"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

order






11. 共享主键关联样例—摘要

12. 一对一关联—持久化代码片段


package com.oracle.test;
import java.util.Date;public class TestOnetoOne {public static void main(String[] args) {Address addr = new Address();addr.setCity("上海");addr.setStreet("南京东路");addr.setZip("021");Order order=new Order();order.setName("order1");order.setCost(200);order.setCreatedDate(new Date());order.setAddr(addr);addr.setOrder(order);Configuration cfg = new Configuration().configure();
SessionFactory sf = null;
Session s = null;
Transaction tran = null;
try {
sf = cfg.buildSessionFactory();
s = sf.openSession();
tran = s.beginTransaction();
s.save(order);tran.commit();
} catch (HibernateException e) {
e.printStackTrace();
tran.rollback();
}finally{
if(s!=null){s.close();}if(sf!=null){sf.close();}
}


13. cascade属性

a) cascade属性,级联操作,指的是当主控方执行操作时(样例中的Order),关联对象(样例中的Address)是否执行同步操作,如主控方执行save-updatedelete方法时,是否同时对关联对象执行save-updatedelete

b) cascade属性可选值:

none:所有情况下均不进行级联

save-update:在执行save-update时进行级联操作

delete:在执行delete时进行级联操作

all:所有情况下均进行级联操作

14. outer-join属性

a) outer-join属性,级联对象加载策略,指的是当主控方被加载时(样例中的Order),关联对象(样例中的Address)是以一个left outer join关联SQL语句加载还是另外使用一个单独的查询SQL加载。

b) select {……} from t_order left outer join t_address on order.id=addr.id where order.id=?

c) select {…} from t_order where id=?;select {…} from t_address where order_id=?

d) outer-join属性可选值:

true:总是使用outer-join

false:不使用outer-join

auto:如果关联对象没有采用Proxy机制,则使用outer-join

一对多关联

1. 一对多关联是应用最广泛的关联,一对多关联包括两种形式:

单向一对多关联

双向一对多关联

2. 一对多关联—数据模型

3. 单向一对多关联—POJO类片段

public class Order {
private Integer Id;
private String name;
private Integer cost;
private Date createdDate;
private Set items;……
}public class Item {
private Integer Id;
private String name;
private Double cost;
private Integer amount;……
}


4. 单向一对多关联—映射配置


"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">











"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">








5. 一对多关联样例—摘要

6. 单向一对多关联—持久化代码片段

package com.oracle.test;
public class TestOnetoMany {public static void main(String[] args) {Set items=new HashSet();Item item1 = new Item();item1.setName("item1");item1.setAmount(1);item1.setCost(12.5);items.add(item1);Item item2 = new Item();item2.setName("item2");item2.setAmount(1);item2.setCost(13.8);items.add(item2);Order order=new Order();order.setName("order1");order.setCost(200);order.setItems(items);Configuration cfg = new Configuration().configure();
SessionFactory sf = null;
Session s = null;
Transaction tran = null;
try {
sf = cfg.buildSessionFactory();
s = sf.openSession();
tran = s.beginTransaction();
s.save(order);tran.commit();
} catch (HibernateException e) {
e.printStackTrace();
tran.rollback();
}finally{
if(s!=null){s.close();}if(sf!=null){sf.close();}
}


7. 双向一对多关联—POJO类片段

package com.oracle.entity;import java.util.Date;
import java.util.Set;public class Order {
private Integer Id;
private String name;
private Integer cost;
private Date createdDate;
private Set items;
public Set getItems() {return items;
}
public void setItems(Set items) {this.items = items;
}package com.oracle.entity;public class Item {
private Integer Id;
private String name;
private Double cost;
private Integer amount;
private Order order;
public Order getOrder() {return order;
}
public void setOrder(Order order) {this.order = order;
}}


8. 双向一对多关联—映射配置


"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">











"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">








9. 双向一对多关联样例—摘要

10. 双向一对多关联—持久化代码片段

package com.oracle.test;
public class TestOnetoMany {public static void main(String[] args) {Set items=new HashSet();Item item1 = new Item();item1.setName("item1");item1.setAmount(1);item1.setCost(12.5);items.add(item1);Item item2 = new Item();item2.setName("item2");item2.setAmount(1);item2.setCost(13.8);items.add(item2);Order order=new Order();order.setName("order1");order.setCost(200);item1.setOrder(order);item2.setOrder(order);order.setItems(items);
Configuration cfg = new Configuration().configure();
SessionFactory sf = null;
Session s = null;
Transaction tran = null;
try {
sf = cfg.buildSessionFactory();
s = sf.openSession();
tran = s.beginTransaction();
s.save(order);tran.commit();
} catch (HibernateException e) {
e.printStackTrace();
tran.rollback();
}finally{
if(s!=null){s.close();}if(sf!=null){sf.close();}
}


11. inverse属性

a) inverse属性,反转,用来指定关联关系的方向,指定由谁来负责关系的维护,inverse=false的一方负责关系的维护

b)one-to-many关系中,将many一方设为关系维护方(inverse=false),有助于性能的改善

12. lazy属性

a) lazy属性,延迟加载,即是否把主控方属性及关联对象一次性加载到内存中,lazy=false,不立即加载,等到用时再去数据库加载关联对象,lazy=true,立即加载关联对象

b)session关闭后再去加载关联对象,会报异常

多对多关联

1. 多对多关联

a) 多对多关联是最复杂的一个关联

b) 表示这一信息的最好方式是通过中间的关联类

c) Hibernate中,可以这个关联类映射为实体,任何一端映射两个一对多的关联

2. 多对多关联—数据模型

3. 多对多关联样例—POJO类片段

package com.oracle.entity;
public class Student {
private Integer Id;
private String name;
private String sex;
private Date birthday;
private Set courses=new HashSet();
public Set getCourses() {return courses;
}
public void setCourses(Set courses) {this.courses = courses;
}
public void addCourse(Course c){this.courses.add(c);c.addStudent(this);
}}
package com.oracle.entity;public class Course {
private Integer Id;
private String name;
private String description;
private Set students=new HashSet();
public Set getStudents() {return students;
}
public void setStudents(Set students) {this.students = students;
}
public void addStudent(Student s){this.students.add(s);
}
}


4. 多对多关联样例—映射文件配置


"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">












"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">












5. 多对多关联样例—摘要

6. 多对多关联—持久化代码片段

public class TestManytoMany {public static void main(String[] args) {Course c1=new Course();c1.setName("corejava");c1.setDescription("java 语言基础!");Course c2=new Course();c2.setName("jdbc");c2.setDescription("java 连接数据库!");Student s1=new Student();s1.setName("rose");s1.addCourse(c1);Student s2=new Student();s2.setName("jack");s2.addCourse(c1);s2.addCourse(c2);
Configuration cfg = new Configuration().configure();
SessionFactory sf = null;
Session s = null;
Transaction tran = null;
try {
sf = cfg.buildSessionFactory();
s = sf.openSession();
tran = s.beginTransaction();
s.save(s1);
s.save(s2);
tran.commit();
} catch (HibernateException e) {
e.printStackTrace();
tran.rollback();
}finally{
if(s!=null){s.close();}if(sf!=null){sf.close();}
}}
}


总结

一对一关联

唯一外键/共享主键

cascade/outer-join

一对多关联

单向/双向

inverse/lazy

多对多关联

中间表


问题

e-learning系统部分功能持久化实现

教师(T)、学生(S)、课程(C)

s:c=m:n

c:t=1:m

控制台出现课程列表(包括任课老师,已选学员人数),输入学生信息进行课程选择,相应的把最新课程列表展示出来。



推荐阅读
  • 程序连接MySQL数据库的多种方法详解 ... [详细]
  • 本文介绍了一个基于C++标准库实现的INI文件读写操作类。该类在现有网络资源的基础上进行了扩展和优化,增加了获取当前可执行文件路径和宽字节与多字节字符串转换的功能。通过这些增强功能,该类能够更好地适应各种应用场景,提高代码的可移植性和健壮性。具体实现细节请参见 `IniFileSTL.h` 文件。 ... [详细]
  • 图像拼接技术深入解析:基于OpenCV 3.4的Stitching模块源码分析(下篇)
    本文继续深入探讨图像拼接技术,特别是在OpenCV 3.4的Stitching模块中的源码实现。通过与VLFeat的SIFT实现进行对比,详细分析了OpenCV在图像特征提取、匹配及拼接过程中的关键算法和技术细节,为读者提供了全面的技术解析和实践指导。 ... [详细]
  • 1packageFileOperation;23importjava.io.File;4importjava.io.FileFilter;5importjava.util.Arra ... [详细]
  • 构建Java自定义持久层框架:实现数据访问与存储的高效解决方案
    JDBC连接数据库步骤:Connection连接对象,PreparedStatement ... [详细]
  • c#学Java–Java基本语法1.类比JAVA .NETJVM CLRJDK  FCL2.java命名约定类名称应以大写字母开头,并成为容易理解的名词或组合。如 ... [详细]
  • Python初学者入门指南:从基础到实践的全面学习路径本文为Python初学者提供了一条从基础到实践的全面学习路径。特别介绍了Python字典(Dictionary)中的`items()`方法,该方法用于返回字典中所有键值对的视图对象,便于在循环和其他操作中使用。通过实例讲解,帮助读者更好地理解和应用这一重要功能。 ... [详细]
  • 力扣——两数之和JAVA
    图片中的方法仅为个人理解,欢迎各位在下方评论 packagecom.shengda.Demo0Likou;importjava.util.HashMap; impor ... [详细]
  • 在 Asp.net 应用中,动态加载 DropDownList 控件的数据源是一项常见需求。本文探讨了如何高效地从数据库中获取数据,并实时更新下拉列表,确保用户界面始终与后台数据保持同步。通过使用 ADO.NET 和 LINQ to SQL 技术,开发者可以轻松实现这一功能,同时提高应用的性能和用户体验。文中还提供了代码示例和最佳实践,帮助开发者解决常见的数据绑定问题。 ... [详细]
  • MySQL 5.6 引入了全局事务标识符(GTID)和多线程复制机制,显著提升了数据库的可靠性和性能。GTID 作为一种新的事务标识方式,确保了事务在主从节点间的一致性,避免了传统基于日志位置的复制可能出现的问题。多线程复制则通过并行处理多个复制任务,大幅提高了复制效率,特别是在大型数据库环境中表现更为突出。这些新特性不仅增强了 MySQL 的高可用性和扩展性,还为数据库管理带来了更多灵活性和便利性。 ... [详细]
  • 在PB数据窗口中,错误处理技术主要针对两类问题进行优化:一是由用户不当数据输入引发的错误,二是程序执行过程中因代码缺陷导致的异常。高效的应用程序设计需确保无论出现哪种类型的错误,系统都能有效应对,保证稳定性和用户体验。通过引入先进的错误检测与恢复机制,可以显著提升系统的健壮性和可靠性。 ... [详细]
  • 在 `index.aspx.cs` 中,我实现了从数据库读取数据的功能,具体代码如下:`int id1 = myReader.GetInt32(0); string id2 = myReader.GetString(2);` 但目前遇到了一些问题,特别是在处理 `id2` 字段时。希望得到关于如何优化数据库操作和解决当前问题的专业指导。 ... [详细]
  • 探索Golang中实现MD5加密的两种高效技术
    本文探讨了在Golang中实现MD5加密的两种高效方法。通过详细分析标准库 `crypto/md5` 的使用技巧和第三方库的性能优势,提供了丰富的代码示例和性能对比数据,帮助开发者选择最适合其应用场景的实现方式。此外,文章还讨论了MD5算法的安全性问题及其在现代应用中的局限性,为读者提供了全面的技术参考。 ... [详细]
  • 本文深入解析了Java编译过程,重点探讨了从源代码到字节码文件的转换机制。通过具体示例,如 `Hello.java` 的编译与反编译过程,详细介绍了 `javap -verbose` 命令的使用方法及其在字节码分析中的重要作用。此外,文章还讨论了字节码文件的结构特点及其在不同应用场景中的实际应用,为开发者提供了宝贵的参考。 ... [详细]
  • 在编写数据库应用程序时,常常需要用户自己在控制面板中配置ODBC数据源。然而对一般用户而言,配置ODBC数据源的工作是有一定困难的。因此, ... [详细]
author-avatar
小dej_531
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有