多对多的两种映射形式:
一。映射多对多关系
老师Teacher 与 课程Course 是一个多对多的关系,XMl配置如下。
三个表的表结构
1. tbl_course.sql
create table "SCOTT"."TBL_COURSE"(
"ID" CHAR(32) not null,
"NAME" VARCHAR2(20) not null,
constraint "SYS_C005315" primary key ("ID")
);
2. tbl_teacher.sql
create table "SCOTT"."TBL_TEACHER"(
"ID" CHAR(32) not null,
"NAME" VARCHAR2(20) not null,
constraint "SYS_C005313" primary key ("ID")
);
3.tbl_teacher_course.sql
create table "SCOTT"."TBL_TEACHER_COURSE"(
"TID" CHAR(32),
"CID" CHAR(32)
);
Teacher.hbm.xml
<hibernate-mapping>
<class name="mapping.Teacher" table="teacher" schema="dbo" catalog="Student">
<id name="id" type="string">
<column name="ID" length="32" />
<generator class="uuid" />
</id>
<property name="name" type="string">
<column name="Name" length="50" not-null="true" />
</property>
<set access="property" name="courses" lazy="true" inverse="true"
cascade="save-update" batch-size="10" fetch="select"
table="teacher_course">
<key column="TID" />
<many-to-many class="mapping.Course1" column="CID" />
</set>
</class>
</hibernate-mapping>
COURSE.hbm.xml
<hibernate-mapping>
<class name="mapping.Course" table="course" schema="dbo" catalog="Student">
<id name="id" type="string">
<column name="ID" length="32" />
<generator class="uuid" />
</id>
<property name="cname" type="string">
<column name="cname" length="50" />
</property>
<set access="property" name="teachers" lazy="true"
inverse="false"
cascade="save-update" batch-size="10" fetch="select" table="teacher_course">
<key column="CID" />
<many-to-many class="mapping.Teacher" column="TID" />
</set>
</class>
</hibernate-mapping>
1. 如果cascade 不管主控方设置还是被控方设置成all或delete,级联删除时,两端以及中间表的记录都会被删除,通常这样的需要是很少的。
2. 只想删除某一端的记录以及中间的表的关联信息。 这种需求通常是很常见的。这个时候cascade的设置是除与delete有关的任何级联约束。以下是删除心得:
2.1 通过主控方来删除
/**
* 多对多 主控方删除(可以删除中间表记录)
*/
Session session = HibernateSessionFactory.getSession();
session.beginTransaction();
String cid = "2c2880d12041c65f012041c665180001";
Course course1 = (Course) session.get(Course.class , cid);
session.delete(course1);
session.getTransaction().commit();
session.close();
2.2 通过被控方来删除
/**
* 多对多 被控方删除(无法删除中间表记录)
*/
String id = "402881ee175a2e7c01175a2e7ead0003" ;
Session session = HibernateSessionFactory.getSession();
session.beginTransaction();
Teacher t1 = (Teacher) session.get(Teacher.class , id);
session.delete(t1);
session.getTransaction().commit();
session.close();
/**
* 多对多 被控方删除(可以删除中间表记录)
*/
String id = "402881ee175a2e7c01175a2e7ead0003" ;
Session session = HibernateSessionFactory.getSession();
session.beginTransaction();
Teacher t1 = (Teacher) session.get(Teacher.class , id);
Set<Course> cs = t1.getCourses();
for (Course c : cs) {
c.getTeachers().remove(t1);
}
session.delete(t1);
session.getTransaction().commit();
session.close();
二。映射为两个一对多关系
三个表结构如下:
CREATE TABLE [dbo].[student] (
[id] [bigint] IDENTITY (1, 1) NOT NULL ,
[sno] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[sname] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[gender] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[score] (
[id] [bigint] IDENTITY (1, 1) NOT NULL ,
[cid] [bigint] NULL ,
[sid] [bigint] NULL ,
[scgrade] [float] NOT NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[course] (
[id] [bigint] IDENTITY (1, 1) NOT NULL ,
[cno] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[cname] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL
) ON [PRIMARY]
Student.hbm.xml
<hibernate-mapping>
<class name="mapping.Student" table="student" schema="dbo" catalog="Student">
<id name="id" type="java.lang.Long">
<column name="id" />
<generator class="identity" />
</id>
<set name="scores" cascade="all" inverse="true" table="score" >
<key>
<column name="sid" not-null="true" />
</key>
<one-to-many class="mapping.Score" />
</set>
</class>
</hibernate-mapping>
Score.hbm.xml
<hibernate-mapping>
<class name="mapping.Score" table="score" schema="dbo" catalog="Student">
<id name="id" type="java.lang.Long">
<column name="id" />
<generator class="identity" />
</id>
<many-to-one name="course" class="mapping.Course" >
<column name="cid" />
</many-to-one>
<many-to-one name="student" class="mapping.Student" >
<column name="sid" />
</many-to-one>
</class>
</hibernate-mapping>
Course.hbm.xml
<hibernate-mapping>
<class name="mapping.Course" table="course" schema="dbo" catalog="Student">
<id name="id" type="java.lang.Long">
<column name="id" />
<generator class="identity" />
</id>
<set name="scores" cascade="all" inverse="true" table="score">
<key>
<column name="cid" not-null="true" />
</key>
<one-to-many class="mapping.Score" />
</set>
</class>
</hibernate-mapping>
/**
* 一对多 被控方删除(可以删除中间表记录) 学生
*/
Long lid = Long.valueOf("19");
Session session = HibernateSessionFactory.getSession();
session.beginTransaction();
Student student = (Student)session.get(Student.class, lid);
session.delete(student);
session.getTransaction().commit();
session.close();
/**
* 一对多 被控方删除(可以删除中间表记录) 课程
*/
Long lid = Long.valueOf("19");
Session session = HibernateSessionFactory.getSession();
session.beginTransaction();
Course course = (Course)session.get(Course.class, lid);
session.delete(course);
session.getTransaction().commit();
session.close();
另外从网上收集了一些资料,进行了整理,
附件内容包括一对一,一对多,多对多类型映射及详细说明。希望对学习hibernate的朋友有所帮助。
分享到:
相关推荐
本文将深入探讨Hibernate中的一对多和多对一映射关系,并通过一个实际的demo演示它们在增删查改操作中的应用。 首先,我们要理解什么是数据库的关联关系。在数据库设计中,我们经常遇到一种情况,即一个实体可能与...
5. **操作关联**:在代码中,可以通过Hibernate的Session接口进行添加、删除、查询等操作,以维护多对多关系。 **数据库代码** 数据库代码部分可能包括创建相关表和中间表的SQL语句,以及填充数据的INSERT语句。...
`hibernate_manytomany_1.jpg`和`hibernate_manytomany_2.jpg`可能包含了多对多关联的配置或操作示意图,而`Hibernate_manytomanyTest.rar`和`accpDB.rar`则可能是相关的源代码或数据库文件,供学习者下载并运行测试...
本项目“hibernate一对多项目”旨在演示如何在JavaWeb应用中使用Hibernate处理一对多的关系映射。这里我们将深入探讨 Hibernate 的一对多关系、配置以及在实际项目中的应用。 首先,一对多关系在数据库中很常见,...
在这个" Hibernate级联操作一对多demo "中,我们将探讨如何在一对多的关系中应用级联操作。 一对多关系是数据库中常见的关系类型,它表示一个实体(如部门)可以有多个相关实体(如员工)。在Hibernate中,这种关系...
在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系模型,它用于处理两个实体类之间存在多个对应关系的情况。这篇博客"hibernate多对多关联映射(单项关联)"深入探讨了如何在Hibernate中实现这种映射...
【标题】:“Hibernate多对多” 在Java编程领域,Hibernate是一个非常重要的对象关系映射(ORM)框架,它简化了数据库操作,使开发者能够用Java对象来操作数据库数据。"Hibernate多对多"指的是在Hibernate中处理两...
五、操作多对多关系 在实际应用中,我们可以通过Hibernate提供的API来添加、删除和查找多对多关系。例如,向`Student`添加一门`Course`,可以使用`addCourse(Course course)`方法;删除则通过`removeCourse(Course ...
在这个“hibernate 多对多映射实例,学生 选课”项目中,我们将探讨如何使用Hibernate处理多对多关系,以及如何构建一个学生选课的系统。 首先,我们要理解多对多关系。在现实生活中,学生和课程之间就是一个典型的...
在本主题中,我们将深入探讨使用Hibernate注解来实现JPA的一对多、多对多和多对一的关系映射。 1. **一对多关系**: 在现实世界中,一个老师可以教多个学生,或者一个班级可以包含多个学生,这就是典型的一对多...
**标题:“Hibernate双向一对多经典实例”** 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者能够用面向对象的方式处理数据。本实例将聚焦于Hibernate中的一对多关系...
通过这个“Hibernate学习:单向多对一关联 工程”,你可以实际操作并理解如何在项目中配置和使用单向多对一关联。这将帮助你更好地掌握Hibernate的关联映射,提升数据库操作的效率和代码的可维护性。项目的源代码`...
通过这三个测试用例,我们可以看到多对一映射的使用方法和 Hibernate 中级联操作的使用。 一对一映射 一对一映射是指两个实体对象之间的一对一映射关系。在 Hibernate 中,一对一映射使用 `<one-to-one>` 元素来...
Hibernate 操作持久化对象是Java开发中用于简化数据库交互的重要工具。它是一个开源的Java持久化框架,由Gavin King创建,并逐渐发展成为Java世界中主流的持久化解决方案。Hibernate的核心在于提供对象-关系映射(ORM...
在这个“Struts+Hibernate一对多的管理系统”项目中,我们将深入理解这两个框架如何协同工作,构建出一个具备一对多关系的数据管理应用。在Java Web开发中,一对多关系非常常见,比如在一个用户可以拥有多个订单的...
“Hibernate 一对一,一对多,多对多例子” 指的是使用Hibernate框架实现数据库中不同关联关系的示例。Hibernate是一个Java持久化框架,它提供了对象关系映射(ORM)功能,使得开发人员可以方便地在Java对象和关系...
对于多表操作,Hibernate支持一对多、多对一、一对一和多对多等关联关系。通过注解或XML配置,可以定义表间的关联,例如`@ManyToOne`、`@OneToMany`、`@OneToOne`和`@ManyToMany`。在操作时,可以通过SessionFactory...
总结起来,Hibernate中的一对多/多对一关联是通过主外键映射来实现的,通过注解和配置文件定义实体间的关联关系,利用懒加载或立即加载策略控制数据获取,同时要注意双向关联的维护和级联操作的设置,以确保数据的...