hibernate一对一,一对多和多对多关联

hibernate一对一,一对多和多对多关联的增删查改

先创建四个类

在这里插入图片描述

他们之间的关系

在这里插入图片描述

Classes类

public class Classes {
	private int cid;
	private String className;
	private Set<Student> students;
}

student类

public class Student {
	private int id;
	private String studentName;
	private IDcard idcard;
	private Classes classes;
	private Set<Subject> subjects;
	
	public Student(String studentName,
			Classes classes) {
		//创建student和IDcard一对一
		IDcard iDcard = new IDcard();
		setIdcard(iDcard);
		this.studentName = studentName;
		this.classes = classes;
	}
}

身份ID类

public class IDcard {
	private int id;
	private int idnumber;
}

课程类

public class Subject {
	private int sid;
	private String subName;
	private Set<Student> students;
	
	public Subject(String subName) {
		super();
		this.subName = subName;
	}
}

然后是配置对应的hbm.xml

classes.hbm.xml

<hibernate-mapping package="entity">
    <!--类名为Classes,表名也为classes-->
    <class name="Classes"  table="classes">

        <!--主键映射,属性名为cid,列名也为cid-->
        <id name="cid" column="cid">
            <!--根据底层数据库主键自动增长-->
            <generator class="increment"/>
        </id>

        <!--非主键映射,属性和列名一一对应-->
        <property name="className" column="className"/>
         <!--一对多设置-->
        <set name="students" cascade="save-update,delete">
            <!--3.2 key的 column表示多的一方外键名 -->
            <key column="cid"/>
            <!--3.3 one-to-many的class属性表示多的一方类的全限定名  -->
            <one-to-many class="Student"/>
        </set>    
   	</class>
</hibernate-mapping>    

student.hbm.xml

<hibernate-mapping package="entity">

    <!--类名为Student,表名也为student-->
    <class name="Student"  table="student">

        <!--主键映射,属性名为id,列名也为id-->
        <id name="id" column="id">
            <!--根据底层数据库主键自动增长-->
            <generator class="increment"/>
        </id>

        <!--非主键映射,属性和列名一一对应-->
        <property name="studentName" column="studentName"/>
        <!--多对多设置-->
        <set name="subjects" cascade="save-update,delete">
            <!--3.2 key的 column表示当前类在中间表中的外键 -->
             <key column="id" />
                 <!--3.3 many-to-many表示多对多关系
                    column:表示另一方在中间表中的外键
                    class:表示另一方类的全限定名
             -->
            <many-to-many class="Subject" ></many-to-many>
     	</set>
        <!--多对一设置-->
        <many-to-one name="idcard" class="IDcard" unique="true" cascade="save-update,delete"/>
        <!--一对一设置-->
        <many-to-one name="classes" class="Classes" column="cid"/>
        
    </class>
</hibernate-mapping>

IDcard.hbm.xml

<hibernate-mapping package="entity">

    <class name="IDcard" table="idcard">
    
	    <id name="id" >
		    <generator class="increment" >
		        <param name="property" >student</param>
		    </generator>
		</id>
	
		<!--非主键映射,属性和列名一一对应-->
	    <property name="idnumber" column="idnumber"/>
	    
    </class>
</hibernate-mapping>

subject.hbm.xml

<hibernate-mapping package="entity">

    <!--类名为Subject,表名也为subject-->
    <class name="Subject"  table="subject">

        <!--主键映射,属性名为sid,列名也为sid-->
        <id name="sid" column="sid">
            <!--根据底层数据库主键自动增长-->
            <generator class="increment"/>
        </id>

        <!--非主键映射,属性和列名一一对应-->
        <property name="subName" column="subName"/>
        <!--多对多设置-->
        <set name="students">
             <!--3.2 key的 column表示当前类在中间表中的外键 -->
             <key column="sid"/>
                 <!--3.3 many-to-many表示多对多关系
                     column:表示另一方在中间表中的外键
                     class:表示另一方类的全限定名
               -->
             <many-to-many class="Student"></many-to-many>
         </set>
    </class>
</hibernate-mapping>   

加载所有映射

<mapping resource="entity/Student.hbm.xml"/>
<mapping resource="entity/IDcard.hbm.xml"/>
<mapping resource="entity/Classes.hbm.xml"/>
<mapping resource="entity/Subject.hbm.xml"/>

开始测试

添加数据:
public static void addmany_to_many(){
		//班级
		Classes classes = new Classes();
		classes.setClassName("软件工程");
		
		//学生
		Set<Student> students = new HashSet<Student>();
		Student student1 = new Student("Naive1", classes);
		Student student2 = new Student("Naive2", classes);
		//把student添加到StudentSet
		students.add(student1);
		students.add(student2);
		
		//把StudentSet添加到classes
		classes.setStudents(students);
		
		//科目
		Set<Subject> subjects = new HashSet<Subject>();
		Subject subject = new Subject("数学");
		Subject subject2 = new Subject("语文");
		//把subject添加到SubjectSet
		subjects.add(subject);
		subjects.add(subject2);
		
		//把student放到subject里
		subject.setStudents(students);
		subject2.setStudents(students);
		//把subject放放到到student里
		student1.setSubjects(subjects);
		student2.setSubjects(subjects);
		
		//得到Session对象
        Session session = HibernateSessionFactory.getSession();
        //使用Hibernate操作数据库,都要开启事务,得到事务对象
        Transaction transaction = session.getTransaction();
        try {
        	 //开启事务
            transaction.begin();
            //把对象添加到数据库中
            session.save(classes);
            //提交事务
            transaction.commit();
            System.out.println("添加成功");
		} catch (Exception e) {
			e.printStackTrace();
			transaction.rollback();
			System.out.println("添加失败");
		}finally {
			 //关闭Session
	        session.close();
		}
	}
查询方法:
public static void selectone(){
      	//得到Session对象
        Session session = HibernateSessionFactory.getSession();
        try {
            //查询数据库
            Classes classes = session.get(Classes.class, 1);
            System.out.println(classes.getStudents().toString());
            System.out.println(classes.toString());
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("查询失败");
		}finally {
			 //关闭Session
	        session.close();
		} 
	}
public static void main(String[] args) {
	addmany_to_many();
	selectone();
	//dalete();
}

运行结果

在这里插入图片描述

hibernate创建的数据库表结构

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值