Hibernate_ManyToOne_Demo

来源:互联网 发布:笔筒淘宝 编辑:程序博客网 时间:2024/05/17 18:11
package org.zttc.itat.test;import org.hibernate.Session;import org.junit.Test;import org.zttc.itat.model.Classroom;import org.zttc.itat.model.Student;import org.zttc.itat.util.HibernateUtil;public class TestManyToOne {@Testpublic void testAdd01() {Session session = null;try {session = HibernateUtil.openSession();session.beginTransaction();//先添加1Classroom c = new Classroom();c.setGrade(2012);c.setName("计算机网络技术");session.save(c);Student stu1 = new Student();stu1.setName("猪八戒");stu1.setNo("001");stu1.setClassroom(c);session.save(stu1);Student stu2 = new Student();stu2.setName("孙悟空");stu2.setNo("002");stu2.setClassroom(c);session.save(stu2);session.getTransaction().commit();} catch (Exception e) {e.printStackTrace();if(session!=null) session.getTransaction().rollback();} finally {HibernateUtil.close(session);}}@Testpublic void testAdd02() {Session session = null;try {session = HibernateUtil.openSession();session.beginTransaction();//先添加多Student stu1 = new Student();stu1.setName("沙僧");stu1.setNo("003");session.save(stu1);Student stu2 = new Student();stu2.setName("唐僧");stu2.setNo("004");session.save(stu2);Classroom c = new Classroom();c.setGrade(2012);c.setName("计算机应用技术");session.save(c);//此时还会发两条updatestu1.setClassroom(c);stu2.setClassroom(c);//最佳实践:一定要先添加一的一方,之后在添加多的一方session.getTransaction().commit();} catch (Exception e) {e.printStackTrace();if(session!=null) session.getTransaction().rollback();} finally {HibernateUtil.close(session);}}@Testpublic void testAdd03() {Session session = null;try {session = HibernateUtil.openSession();session.beginTransaction();Classroom c = new Classroom();c.setGrade(2012);c.setName("计算机信息管理");//此时classroom没有存储,所以在添加student的时候没有外键,会抛出异常Student stu1 = new Student();stu1.setName("如来");stu1.setNo("005");session.save(stu1);Student stu2 = new Student();stu2.setName("观音");stu2.setNo("006");session.save(stu2);stu1.setClassroom(c);stu2.setClassroom(c);session.getTransaction().commit();} catch (Exception e) {e.printStackTrace();if(session!=null) session.getTransaction().rollback();} finally {HibernateUtil.close(session);}}@Testpublic void testDelete01() {/***这个是用来讲xml配置文件中的<many-to-one name="classroom" column="cid"/>*这个里面的cascade属性的使用(参考xml配置文件)*/Session session = null;try {session = HibernateUtil.openSession();session.beginTransaction();Student stu = (Student)session.load(Student.class, 7);session.delete(stu);session.getTransaction().commit();} catch (Exception e) {e.printStackTrace();if(session!=null) session.getTransaction().rollback();} finally {HibernateUtil.close(session);}}@Testpublic void testLoad() {Session session = null;try {session = HibernateUtil.openSession();session.beginTransaction();Student stu = (Student)session.load(Student.class, 1);//此时仅仅只是发一条sqlSystem.out.println(stu.getName());//此时student的关联对象Classroom也是延迟加载的,会再发一条sql来取对象System.out.println(stu.getClassroom().getName());session.getTransaction().commit();} catch (Exception e) {e.printStackTrace();if(session!=null) session.getTransaction().rollback();} finally {HibernateUtil.close(session);}}}

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="org.zttc.itat.model">    <class name="Student" table="t_stu">        <id name="id">          <generator class="native"/>        </id>        <property name="name"/>        <property name="no"/>        <!-- many-to-one用来映射多对一,name表示对象中的属性名称 ,column用来表示外键的名称-->        <!-- 当设置了cascade的时候,会自动完成关联,如果添加时没有关联对象,会自动创建一个关联对象        最佳实践:如果没有特殊情况不要使用cascade,特别注意,可能使用cascade的地方一般都是一的一方进行删除时使用        特殊需求才会使用cascade的add,正常情况add方法都是应该有程序员完成添加 -->        <many-to-one name="classroom" column="cid"/>    </class></hibernate-mapping>

0 0