hibernate多对多关联

多对多表的搭建

java类中

多对多

1、关系操作

1、多对多,谁操作效率都一样

2、解除关系

把第三张表的一行数据删除掉

3、建立关系

把第三张表的数据增加一行记录

4、变更关系

先删除后增加

2、级联操作

都是对象针对集合的操作

例子

工具类

public class HibernateUtils {
    public static SessionFactory sessionFactory;
    public static String url;
    @Before
    public void init(){
        Configuration configuration = new Configuration();
        if(url==null){
            configuration.configure();
        }else{
            configuration.configure(url);
        }
        sessionFactory = configuration.buildSessionFactory();
}

student映射文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="cn.itcast.many.Student">
        <id name="sid" length="5">
            <generator class="increment"></generator>
        </id>
        <property name="sname" length="20"></property>
        <property name="description" length="100"></property>
        <set name="coursess" table="student_course" cascade="save-update">
        <key>
            <column name="sid"></column>
        </key>
        <many-to-many class="cn.itcast.many.Courses" column="cid"></many-to-many>
        </set>
     
    </class>
</hibernate-mapping>

courses映射文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="cn.itcast.many.Courses">
        <id name="cid" length="5">
            <generator class="increment"></generator>
        </id>
        <property name="cname" length="20"></property>
        <property name="description" length="100"></property>
        <set name="students" table="student_course" cascade="save-update">
        <key>
            <column name="cid"></column>
        </key>
         <many-to-many class="cn.itcast.many.Student" column="sid"></many-to-many>
        </set>
     
    </class>
</hibernate-mapping>

测试

@Test
public void testCreateTable(){
}
@Test
public void testSaveStudent_Cascade_Courses_Save(){
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    Student student = new Student();
    student.setSname("班长");
    student.setDescription("牛人");
    Courses Courses = new Courses();
    Courses.setCname("生理卫生");
    Courses.setDescription("很好");
    Set<Courses> Coursess = new HashSet<Courses>();
    Coursess.add(Courses);
    student.setCoursess(Coursess);
    session.save(student);
    transaction.commit();
    session.close();
}
/**
 * 已经存在一个课程,新建一个学生,建立课程和学生之间的关系
 *    从课程角度出发
 */
@Test
public void testUpdateCourses_Cascade_Student_Save_R(){
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    Courses Courses = (Courses)session.get(Courses.class, 1L);
    Student student = new Student();
    student.setSname("班迷");
    student.setDescription("班丝:班长的钢丝");
    Courses.getStudents().add(student);
    session.save(student);
    transaction.commit();
    session.close();
}
/**
 * 已经存在一个课程,新建一个学生,建立课程和学生之间的关系
 *   从学生角度出发
 */
@Test
public void testSaveStudent_R(){
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    Courses Courses = (Courses)session.get(Courses.class, 1L);
    Student student = new Student();
    student.setSname("班迷");
    student.setDescription("班丝:班长的钢丝");
    Set<Courses> Coursess = new HashSet<Courses>();
    Coursess.add(Courses);
    student.setCoursess(Coursess);
    session.save(student);
    transaction.commit();
    session.close();
}
/**
 * 已经存在一个课程,已经存在一个学生,建立关联
 */
@Test
public void testR(){
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    Courses Courses = (Courses)session.get(Courses.class, 1L);
    Student student = (Student)session.get(Student.class, 2L);
    student.getCoursess().add(Courses);
    transaction.commit();
    session.close();
}
/**
 * 把学生3,4加入到课程1中
 */
@Test
public void testR_Some(){
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    Courses Courses = (Courses)session.get(Courses.class, 1L);
    Student student = (Student)session.get(Student.class, 3L);
    Student student2 = (Student)session.get(Student.class, 4L);
    //student.getCoursess().add(Courses);
    //student2.getCoursess().add(Courses);
    Courses.getStudents().add(student2);
    Courses.getStudents().add(student);
    transaction.commit();
    session.close();
}
/**
 * 把一个学生加入到一些课程中
 */
@Test
public void testR_Some_2(){
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    Student student = (Student)session.get(Student.class, 3L);
    List<Courses> CoursesList = session.createQuery("from Courses where cid in(1,2,3)").list();
    student.getCoursess().addAll(CoursesList);
    transaction.commit();
    session.close();
}
/**
 * 把学生从一个课程转移到另外一个课程
 */
@Test
public void testTransform(){
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    Student student = (Student) session.get(Student.class, 3L);
    Courses Courses1 = (Courses)session.get(Courses.class, 1L);
    Courses Courses3 = (Courses)session.get(Courses.class, 3L);
    student.getCoursess().remove(Courses1);
    student.getCoursess().add(Courses3);
    transaction.commit();
    session.close();
}

关联删除的错误

1、根据映射文件可以得出classes与student有关联

2、在客户端,students是由classes产生的,代表了关联关系

3、所以在删除student的时候,必须通过classes解除关系

4、解除关系以后才能进行删除

时间: 2024-08-06 05:52:24

hibernate多对多关联的相关文章

hibernate多对一关联映射

hibernate多对一关联映射: 实体类 (POJO) public class Student{ private int stuId; private String stuNum; private String stuName; private ClassRoom cr; } public class ClassRoom{ private int claId; private String claName; } 映射文件 <class name=" Student" tabl

atitit.atitit.hb many2one relate hibernate 多对一关联配置..

atitit.atitit.hb many2one relate hibernate 多对一关联配置.. 1. 多对一单向 @ManyToOne 1 1. 其中@JoinColumn 注解 2 2. @targetEntity注解 2 2. 生成的sql LEFT OUTER 2 3. 多对一也可以通过关联表的方式来映射,通过 @JoinTable 注解可 2 4. 另外一个属性也关联到table column(recomn?? ) 3 5. 参考 3 1. 多对一单向 @ManyToOne (

05.Hibernate多对多关联

前言:本文讲解使用Hibernate映射多对多关联关系,并使用多种方式映射多对多关联. 1.数据库表的多对多关系 本文根据学生信息表(tb_student)和教师信息表(tb_teacher)来说明多对多映射关系,一个学生有多个老师,一个老师也有多个学生,其数据库模型图如下: 根据以上图,对应的建表语句如下: CREATE TABLE tb_student ( id bigint NOT NULL auto_increment COMMENT 'ID', no varchar(10) NOT N

hibernate多对一关联映射两种形式的理解

关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 多对一单向和多对一双向关联: 单向:多对一单向是只用维护多的一方,例如一家厂商(Factory)可以生产多种产品(Product),只用在Product实体类和配置文件中配置即可.在Product实体属性类中,需要有Factory属性,而不再需要外键这个属性,因为关联外键的配置在配置文件中many-to-one. 双向:多对一双向关联需要双方都维护对方,例如班级(Class)和学生(Student)之间的关系,需要在Class实体类和

Hibernate 多对一关联查询

一.单向多对一和双向多对一的区别 如果只需要从一方获取另一方数据,就用单向多对一:如果需要从双方都获取对方数据,就用双向多对一. 如果有两个对象,一个为User对象,一个为Department对象,一个用户只能属于一个部门,而一个部门可以包含多个用户.这样就是多对一关系.如下图 假设:我们需要通过用户找到所对应的部门,不需要通过部门查询该部门有哪些用户,就采用单向多对一关系 如果:我们不仅需要通过用户获取所对应的部门,还需要通过部门对象获取该部门下的用户,那么就采用双向多对一 二.单向多对一关系

Hibernate 多对多关联Demo

以学生[Student ]与课程[Course ]之间的关系为例: 1 //Course .java 2 3 public class Course implements Serializable { 4 private long cid; 5 private String cname; 6 private String cdesc; 7 private Set<Student> students; 8 //get与set 9 } //Student.java1 public class St

hibernate多对多关联配置文件写法

CmsUserEntry Set<CmsRoleEntry> roles=new CmsRoleEntry(); public void getroles(){ Return roles; } Public void setroles(Set<CmsRoleEntry> cmsRoleEntrys){ thisNaNsRoleEntrys=cmsRoleEntrys; } CmsRoleEntry Set<CmsUserEntry> users=new CmsUserE

Hibernate 多对多关联查询条件使用

from Brand as b inner join fetch b.styles as s where s.styleId=?

hibernate多对多关系配置--增删改查

hibernate多对多关联配置--并实现增删改查 hibernate就不多介绍了,这里就直接上我项目中使用的例子做说明. 数据模型 这是项目中用户和用户组的数据模型er图草稿,具体的model对象字段就以项目中的为主了. model类以及pojo接口,这里pojo接口用不上,大家测试的时候也可以去掉 package com.supre.model; import java.io.Serializable; import java.util.Set; public class User { pr