Hibernate笔记之6数据关联多对多

本文介绍如何在Hibernate中实现多对多关系的映射,包括创建关联表、配置映射文件及通过代码操作关联关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多对多关系呢 在开发中尽量少使用,因为多对多性能很低。

要创建一个多对多关系,在两个多对多关系表之间必须创建一个关联表。

例如:
Student(学生)和Course(课程)的关系就是多对多关系。在映射多对多关系时需要另外使用一个连接表(如Student_Course)。Student_Course表包含二个字段:courseID和studentID。此处它们的映射文件中使用<many-to-many>标记,
在Student的映射文件中加入以下描述信息:

  <set name="courses"
               table="student_course"
               lazy="false"
               inverse="false"
               cascade="save-update">
               <key column="studentID" />
           <many-to-many class="Course" column="CourseID"/>   
           </set>

相应的Course的映射文件中加入以下:

 <set name="students"
               table="student_course"
               lazy="false"
               inverse="true"
               cascade="save-update">
               <key column="CourseID" />
           <many-to-many class="Student" column="StudentID"/>   
           </set>
。。。。。。。。。。。。。。。。。。。。。
删除关联关系比较简单,直接调用对象集合的remove()方法删除不要的对象就可。例如:要从学生Bill的选课清单中删除politics和chemistry两门课,程序代码如下:         //获取代表Bill的Student对象
        Student stu = (Student)session.createQuery("from Student s where s.name='Bill'").uniqueResult();
        Course course1 = (Course)session.createQuery("from Course c where c.name='politics'").uniqueResult();
        Course course2 = (Course)session.createQuery("from Course c where c.name='chemistry'").uniqueResult();
        stu.getCourse().remove(course1);//删除politics课程
        stu.getCourse().remove(course2);//删除chemistry课程运行以上程序将从student_course表中删除这两条记录,但T_student和T_course表没有任何变化
*****************************************************
下面就举个例子:人和服务的多对多关系:
先创建3张表:
-- 删除表
DROP TABLE person ;
DROP TABLE server ;

CREATE TABLE person
(
 pid VARCHAR(32) NOT NULL PRIMARY KEY ,
 name VARCHAR(20) NOT NULL ,
 age INT
) ;
CREATE TABLE server
(
 sid VARCHAR(32) NOT NULL PRIMARY KEY ,
 name VARCHAR(20) NOT NULL
) ;
CREATE TABLE person_server
(
 pid VARCHAR(32) ,
 sid VARCHAR(32) ,
 FOREIGN KEY (pid) REFERENCES person(pid) ON DELETE CASCADE ,
 FOREIGN KEY (sid) REFERENCES server(sid) ON DELETE CASCADE
) ;
*****************************************************************
写POJO类:
package wjr.hibernate.demo23_26.associatedNN;

import java.util.Set;

public class Person {
 private String pid ;
 private String name ;
 private int age ;
 private Set servers ;
。。。。getter和setter方法。。。
}
。。。。。。。。。。。。。。
package wjr.hibernate.demo23_26.associatedNN;

import java.util.Set;

public class Server {
 private String sid ;
 private String name ;
 private Set persons ;
。。。。getter和setter方法。。。
}
**********************************************
映射文件:
<class name="wjr.hibernate.demo23_26.associatedNN.Person" table="person">
  <id name="pid" type="java.lang.String">
   <column name="pid" length="32" />
   <generator class="uuid.hex"></generator>
  </id>
  <property name="name" type="java.lang.String">
   <column name="name" length="20" not-null="true" />
  </property>
  <property name="age" type="java.lang.Integer">
   <column name="age" />
  </property>
  <set name="servers" table="person_server" cascade="all">
   <key column="pid"></key>
   <many-to-many class="wjr.hibernate.demo23_26.associatedNN.Server"
    column="sid">
   </many-to-many>
  </set>
 </class>
。。。。。。。。。。。。。。。。。。。。。。。。。。
 <class name="wjr.hibernate.demo23_26.associatedNN.Server" table="server">
        <id name="sid" type="java.lang.String">
            <column name="sid" length="32" />
            <generator class="uuid.hex" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="20" not-null="true" />
        </property>
        <set name="persons" table="person_server" cascade="all">
   <key column="sid"></key>
   <many-to-many class="wjr.hibernate.demo23_26.associatedNN.Person"
    column="pid">
   </many-to-many>
  </set>
    </class>
*****************************************
测试类:
package wjr.hibernate.demo23_26.associatedNN;

import java.util.Iterator;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;

public class PersonServerOperation {
 private Session session;

 public PersonServerOperation() {
  this.session = new Configuration().configure().buildSessionFactory()
    .openSession();
 }

 public void insert(Person per) {
  this.session.save(per);
  this.session.beginTransaction().commit();
 }

 public void insert(Server ser) {
  this.session.save(ser);
  this.session.beginTransaction().commit();
 }

 public Person queryByPid(String pid) {
  Person p = null;
  String hql = "FROM Person AS p WHERE p.pid=?";
  Query q = this.session.createQuery(hql);
  q.setString(0, pid);
  List all = q.list();
  if (all.size() > 0) {
   p = (Person) all.get(0);
  }
  return p;
 }

 public Server queryBySid(String sid) {
  Server s = null;
  String hql = "FROM Server AS s WHERE s.sid=?";
  Query q = this.session.createQuery(hql);
  q.setString(0, sid);
  List all = q.list();
  if (all.size() > 0) {
   s = (Server) all.get(0);
  }
  return s;
 }
 
 public void deleteByPid(String pid)
 {
  String hql = "DELETE FROM Person WHERE pid=?" ;
  Query q = this.session.createQuery(hql) ;
  q.setString(0,pid) ;
  q.executeUpdate() ;
  this.session.beginTransaction().commit() ;
 }

 /**
  * @param args
  */
 public static void main(String[] args) {
  PersonServerOperation pso = new PersonServerOperation();
  //基本的数据插入:
//   Person person = new Person() ;
//   person.setName("王江荣") ;
//   person.setAge(25) ;
//   person.setServers(new HashSet()) ;
//    
//   Server server = null ;
//   server = new Server() ;
//   server.setName("一年包换") ;
//   person.getServers().add(server) ;
//    
//   server = new Server() ;
//   server.setName("3年维修免费") ;
//   person.getServers().add(server) ;
//    
//   server = new Server() ;
//   server.setName("免费抽奖") ;
//   person.getServers().add(server) ;
//    
//   server = new Server() ;
//   server.setName("3日两人全国游") ;
//   person.getServers().add(server) ;
//    
//   server = new Server() ;
//   server.setName("手机话费赠送100") ;
//   person.getServers().add(server) ;
//    
//   pso.insert(person) ;

  //插入人和相关服务项目
//   Server server = new Server() ;
//   server.setName("异地免费维修") ;
//   server.setPersons(new HashSet()) ;
//   Person person = null ;
//   person = new Person() ;
//   person.setName("霞霞") ;
//   person.setAge(22) ;
//   server.getPersons().add(person) ;
//    
//   person = new Person() ;
//   person.setName("阿牛") ;
//   person.setAge(28) ;
//   server.getPersons().add(person) ;
//    
//   person = new Person() ;
//   person.setName("李小姐") ;
//   person.setAge(29) ;
//   server.getPersons().add(person) ;
//    
//   pso.insert(server) ;
  
  //测试查询某个人享受了哪些服务:
//  Person p = pso.queryByPid("402881e82084b78e012084b7918d0001");
//  System.out.println(p.getName() + " --> " + p.getAge());
//  System.out.println("所享受的各种服务项目:");
//  Iterator iter = p.getServers().iterator();
//  while (iter.hasNext()) {
//   Server s = (Server) iter.next();
//   System.out.println("  |- "+s.getName()) ;
//  }
  
  //测试查询某项服务都有哪些人拥有
  Server s = pso.queryBySid("402881e82084bd93012084bd95c60001");
  System.out.println(s.getName());
  System.out.println("享受服务的相关人员名单:");
  Iterator iter = s.getPersons().iterator();
  while (iter.hasNext()) {
   Person p = (Person) iter.next();
   System.out.println("  |- "+p.getName()+" --> "+p.getAge()) ;
  }
  
 }

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值