[SXT][WY]Hibernate07 一对多关联映射

2024-01-25 19:48

本文主要是介绍[SXT][WY]Hibernate07 一对多关联映射,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

hibernate一对多关联映射(单向Classes----->Student)

 

一对多关联映射利用了多对一关联映射原理

多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一
一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多

也就是说一对多和多对一的映射策略是一样的,只是站的角度不同

在一一端维护关系的缺点:
 * 如果将t_student表里的classesid字段设置为非空,则无法保存
 * 因为不是在student这一端维护关系,所以student不知道是哪个班的,
   所以需要发出多余的update语句来更新关系

 

classes.hbm.xml

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bjsxt.hibernate">
 <class name="Classes" table="t_classes">
  <id name="id">
   <generator class="native"/>
  </id>
  <property name="name"/>
  <set name="students">
   <key column="classesid"/>
   <one-to-many class="Student"/>
  </set>
 </class>
</hibernate-mapping>

 

student.hbm.xml

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
 <class name="com.bjsxt.hibernate.Student" table="t_student">
  <id name="id">
   <generator class="native"/>
  </id>
  <property name="name"/>
 </class>
</hibernate-mapping>

 

public void testSave1() {
  Session session = null;
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   Student student1 = new Student();
   student1.setName("10");

   // 如果 student表的classid被设为not-null的,则这里会存不进去。所以not-null应该为false

   // 如果这里不保存,在save class的时候,会有临时对象未保存错误。
   session.save(student1);
   
   Student student2 = new Student();
   student2.setName("祖儿");
   session.save(student2);
   
   Set students = new HashSet();
   students.add(student1);
   students.add(student2);
   
   Classes classes = new Classes();
   classes.setName("尚学堂");
   classes.setStudents(students);
   
   //可以正确保存. 但是缺点是,这里还要update student的classid
   session.save(classes);
   
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
 } 
 
 public void testLoad1() {
  Session session = null;
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   Classes classes = (Classes)session.load(Classes.class, 1);
   System.out.println("classes.name=" + classes.getName());
   Set students = classes.getStudents();
   for (Iterator iter=students.iterator(); iter.hasNext();) {
    Student student = (Student)iter.next();
    System.out.println("student.name=" + student.getName());
   }
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
 }  

 

 

hihernate一对多关联映射(双向Classes<----->Student)

 

一对多双向关联映射:
 * 在一一端的集合上使用<key>,在对方表中加入一个外键指向一一端
 * 在多一端采用<many-to-one>
 
注意:<key>标签指定的外键字段必须和<many-to-one>指定的外键字段一致,否则引用字段的错误
 
如果在”一“一端维护一对多关联关系,hibernate会发出多余的udpate语句,所以我们一般在多
的一端来维护关联关系

关于inverse属性:
 inverse主要用在一对多和多对多双向关联上,inverse可以被设置到集合标签<set>上,
 默认inverse为false,所以我们可以从”一“一端和”多“一端维护关联关系,
 如果设置成inverse为true,则我们只能从多一端来维护关联关系
 
 注意:inverse属性,只影响数据的存储,也就是持久化
  
inverse和cascade
 * inverse是关联关系的控制方向
 * cascade操作上的连锁反应

 

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bjsxt.hibernate">
 <class name="Classes" table="t_classes">
  <id name="id">
   <generator class="native"/>
  </id>
  <property name="name"/>
  <set name="students" inverse="true" cascade="all">
   <key column="classesid"/>
   <one-to-many class="Student"/>
  </set>
 </class>
</hibernate-mapping>

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
 <class name="com.bjsxt.hibernate.Student" table="t_student">
  <id name="id">
   <generator class="native"/>
  </id>
  <property name="name"/>
  <many-to-one name="classes" column="classesid"/>
 </class>
</hibernate-mapping>

 

 

public void testSave1() {
  Session session = null;
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   Student student1 = new Student();
   student1.setName("10");
   session.save(student1);
   
   Student student2 = new Student();
   student2.setName("祖儿");
   session.save(student2);
   
   Set students = new HashSet();
   students.add(student1);
   students.add(student2);
   
   Classes classes = new Classes();
   classes.setName("尚学堂");
   classes.setStudents(students);
   
   //可以正确保存
   session.save(classes);
   
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
 } 
 // 最常用
 public void testSave2() {
  Session session = null;
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   Classes classes = new Classes();
   classes.setName("尚学堂");
   session.save(classes);
   
   Student student1 = new Student();
   student1.setName("10");
   student1.setClasses(classes);
   session.save(student1);
   
   Student student2 = new Student();
   student2.setName("祖儿");
   student2.setClasses(classes);
   session.save(student2);
   
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
 }  
 
 public void testSave3() {
  Session session = null;
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();

   Classes classes = new Classes();
   classes.setName("尚学堂");
   
   Student student1 = new Student();
   student1.setName("10");
   student1.setClasses(classes);
   
   Student student2 = new Student();
   student2.setName("祖儿");
   student2.setClasses(classes);
   
   Set students = new HashSet();
   students.add(student1);
   students.add(student2);
   
   classes.setStudents(students);
   
   //可以正确保存
   session.save(classes);
   
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
 }  
 public void testLoad1() {
  Session session = null;
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   Classes classes = (Classes)session.load(Classes.class, 1);
   System.out.println("classes.name=" + classes.getName());
   Set students = classes.getStudents();
   for (Iterator iter=students.iterator(); iter.hasNext();) {
    Student student = (Student)iter.next();
    System.out.println("student.name=" + student.getName());
   }
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
 }  
 
 public void testLoad2() {
  Session session = null;
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   Student student = (Student)session.load(Student.class, 1);
   System.out.println("student.name=" + student.getName());
   System.out.println("student.classes.name=" + student.getClasses().getName());
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
 }

这篇关于[SXT][WY]Hibernate07 一对多关联映射的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/644411

相关文章

C++ STL关联容器Set与集合论入门

1. 简介 Set(集合)属于关联式容器,也是STL中最实用的容器,关联式容器依据特定的排序准则,自动为其元素排序。Set集合的底层使用一颗红黑树,其属于一种非线性的数据结构,每一次插入数据都会自动进行排序,注意,不是需要排序时再排序,而是每一次插入数据的时候其都会自动进行排序。因此,Set中的元素总是顺序的。 Set的性质有:数据自动进行排序且数据唯一,是一种集合元素,允许进行数学上的集合相

关联规则(一)Apriori算法

此篇文章转自 http://blog.sina.com.cn/s/blog_6a17628d0100v83b.html 个人觉得比课本上讲的更通俗易懂! 1.  挖掘关联规则 1.1   什么是关联规则 一言蔽之,关联规则是形如X→Y的蕴涵式,表示通过X可以推导“得到”Y,其中X和Y分别称为关联规则的先导(antecedent或left-hand-side, LHS)和后

【数据库实战】1_Oracle_命中关联人或黑名单或反洗钱客户

一、字段名称 1、CST_ID :客户编号 2、IDV_LGL_NM :客户姓名 3、关联方标志 RELPARTY_IND,0-否 未命中,1-是 命中 4、TBPC1010表,RSRV_FLD1_INF(备用字段)中的 第6位:黑名单标志,0无,1是。 第10位:反洗钱风险等级1-5。 反洗钱风险等级5级: 1级-低风险客户 2级-较低风险客户 3级-中风险客户 4级-较高风险客户 5级-高风

docker 重启容器且修改服务映射端口

要重启 Docker 容器并修改服务的映射端口,可以按照以下步骤进行操作: 1. 停止当前运行的容器 如果你想重新配置端口,通常需要先停止当前运行的容器。你可以使用以下命令停止容器: docker stop <container_name_or_id> 2. 删除现有容器 为了修改端口映射,你需要删除旧的容器并重新创建一个新的容器。首先运行以下命令删除停止的容器: docker rm

maven项目中程序运行编译的时候出现:编码GBK的不可映射字符

由于JDK是国际版的,我们在用javac.exe编译时,编译程序首先会获得我们操作系统默认采用的编码格式(也即在编译java程序时,若我们不指定源程序文件的编码格式,JDK首先获得操作系统的file.encoding参数(它保存的就是操作系统默认的编码格式,如WIN2k,它的值为GBK),然后JDK就把我们的java源程序从file.encoding编码格式转化为JAVA内部默认的UNICODE格

ManyToMany双向外键关联(基于注解)的映射案例(简单版)

学生和老师就是多对多的关系,一个学生有多个学生,一个老师也有多个学生,这里的多对多映射采用中间表连接的映射策略,建立中间表的映射策略,建立中间表分别引入俩边的主键作为外键。通过中间表映射俩个表之间的关系。 下面就以学生类和老师类为例介绍多对多的映射关系的实例 Students类 package mtm_bfk;import java.io.Serializable;import java.

ISO26262和Aspice之间的关联

ASPICE 介绍: ASPICE(Automotive Software Process Improvement and Capability dEtermination)是汽车软件过程改进及能力评定的模型,它侧重于汽车软件的开发过程。ASPICE 定义了一系列的过程和活动,包括需求管理、软件设计、软件实现、软件测试、软件集成、软件配置管理、软件质量保证等方面。其目的是通过评估和改进汽车软件的

Flink重点难点:维表关联理论和Join实战

点击上方蓝色字体,选择“设为星标” 回复”面试“获取更多惊喜 在阅读本文之前,你应该阅读过的系列: 《Flink重点难点:时间、窗口和流Join》《Flink重点难点:网络流控和反压》 Flink官方文档中公开的信息 1 Join 的概念 在阅读之前请一定要先了解: 数据流操作的另一个常见需求是对两条数据流中的事件进行联结(connect)或Join。Flink DataStream API中

Mybatis查询到多条记录但是映射到list集合只有一条或者条数不对

如果你出现了这个问题。 *. 原因:mybatis是基于当前实体对象的id进行映射的 *.所以在查询字段中加上查询id即可。 搞定!!!!

【高等数学学习记录】映射

【高等数学&学习记录】映射 从事测绘工作多年,深刻感受到基础知识的重要及自身在这方面的短板。 为此,打算重温测绘工作所需基础知识。练好基本功,为测绘工作赋能。 1 知识点 1.1 映射 映射 设 X X X、 Y Y Y是非空集合,若存在法则 f f f,使 X X X中每个元素 x x x,在 Y Y Y中有唯一确定的元素 y y y与之对应,则称 f f f为从 X X X到