`
lzg3267373
  • 浏览: 30549 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

hibernate 多对多操作

阅读更多
多对多的两种映射形式:
一。映射多对多关系
老师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(一对多,多对一映射)操作

    本文将深入探讨Hibernate中的一对多和多对一映射关系,并通过一个实际的demo演示它们在增删查改操作中的应用。 首先,我们要理解什么是数据库的关联关系。在数据库设计中,我们经常遇到一种情况,即一个实体可能与...

    Hibernate多对多实例+数据库代码

    5. **操作关联**:在代码中,可以通过Hibernate的Session接口进行添加、删除、查询等操作,以维护多对多关系。 **数据库代码** 数据库代码部分可能包括创建相关表和中间表的SQL语句,以及填充数据的INSERT语句。...

    Hibernate多对多关联添加及查询示例

    `hibernate_manytomany_1.jpg`和`hibernate_manytomany_2.jpg`可能包含了多对多关联的配置或操作示意图,而`Hibernate_manytomanyTest.rar`和`accpDB.rar`则可能是相关的源代码或数据库文件,供学习者下载并运行测试...

    hibernate一对多项目

    本项目“hibernate一对多项目”旨在演示如何在JavaWeb应用中使用Hibernate处理一对多的关系映射。这里我们将深入探讨 Hibernate 的一对多关系、配置以及在实际项目中的应用。 首先,一对多关系在数据库中很常见,...

    Hibernate级联操作一对多demo

    在这个" Hibernate级联操作一对多demo "中,我们将探讨如何在一对多的关系中应用级联操作。 一对多关系是数据库中常见的关系类型,它表示一个实体(如部门)可以有多个相关实体(如员工)。在Hibernate中,这种关系...

    hibernate多对多关联映射(单项关联)

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系模型,它用于处理两个实体类之间存在多个对应关系的情况。这篇博客"hibernate多对多关联映射(单项关联)"深入探讨了如何在Hibernate中实现这种映射...

    hibernate多对多

    【标题】:“Hibernate多对多” 在Java编程领域,Hibernate是一个非常重要的对象关系映射(ORM)框架,它简化了数据库操作,使开发者能够用Java对象来操作数据库数据。"Hibernate多对多"指的是在Hibernate中处理两...

    hibernate 映射关系学习入门 多对多实体映射

    五、操作多对多关系 在实际应用中,我们可以通过Hibernate提供的API来添加、删除和查找多对多关系。例如,向`Student`添加一门`Course`,可以使用`addCourse(Course course)`方法;删除则通过`removeCourse(Course ...

    hibernate 多对多映射实例,学生 选课

    在这个“hibernate 多对多映射实例,学生 选课”项目中,我们将探讨如何使用Hibernate处理多对多关系,以及如何构建一个学生选课的系统。 首先,我们要理解多对多关系。在现实生活中,学生和课程之间就是一个典型的...

    Hibernate annotation JPA 一对多,多对多

    在本主题中,我们将深入探讨使用Hibernate注解来实现JPA的一对多、多对多和多对一的关系映射。 1. **一对多关系**: 在现实世界中,一个老师可以教多个学生,或者一个班级可以包含多个学生,这就是典型的一对多...

    Hibernate双向一对多经典实例

    **标题:“Hibernate双向一对多经典实例”** 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者能够用面向对象的方式处理数据。本实例将聚焦于Hibernate中的一对多关系...

    Hibernate学习:单向多对一关联 工程

    通过这个“Hibernate学习:单向多对一关联 工程”,你可以实际操作并理解如何在项目中配置和使用单向多对一关联。这将帮助你更好地掌握Hibernate的关联映射,提升数据库操作的效率和代码的可维护性。项目的源代码`...

    hibernate多对一、一对一、一对多、多对多映射的理解(经典)

    通过这三个测试用例,我们可以看到多对一映射的使用方法和 Hibernate 中级联操作的使用。 一对一映射 一对一映射是指两个实体对象之间的一对一映射关系。在 Hibernate 中,一对一映射使用 `&lt;one-to-one&gt;` 元素来...

    Hibernate操作持久化对象

    Hibernate 操作持久化对象是Java开发中用于简化数据库交互的重要工具。它是一个开源的Java持久化框架,由Gavin King创建,并逐渐发展成为Java世界中主流的持久化解决方案。Hibernate的核心在于提供对象-关系映射(ORM...

    struts+hibernate一对多的管理系统

    在这个“Struts+Hibernate一对多的管理系统”项目中,我们将深入理解这两个框架如何协同工作,构建出一个具备一对多关系的数据管理应用。在Java Web开发中,一对多关系非常常见,比如在一个用户可以拥有多个订单的...

    Hibernate 一对一,一对多,多对多例子

    “Hibernate 一对一,一对多,多对多例子” 指的是使用Hibernate框架实现数据库中不同关联关系的示例。Hibernate是一个Java持久化框架,它提供了对象关系映射(ORM)功能,使得开发人员可以方便地在Java对象和关系...

    struts2+hibernate+spring多表操作示例

    对于多表操作,Hibernate支持一对多、多对一、一对一和多对多等关联关系。通过注解或XML配置,可以定义表间的关联,例如`@ManyToOne`、`@OneToMany`、`@OneToOne`和`@ManyToMany`。在操作时,可以通过SessionFactory...

    hibernate基于主外键的一对多/多对一关联

    总结起来,Hibernate中的一对多/多对一关联是通过主外键映射来实现的,通过注解和配置文件定义实体间的关联关系,利用懒加载或立即加载策略控制数据获取,同时要注意双向关联的维护和级联操作的设置,以确保数据的...

Global site tag (gtag.js) - Google Analytics