hibernate中one2Many双向

2019-03-28 21:43|来源: 领悟书生

hibernate中ManyToOne单向中,我们说过班级和学生的关系,如果要使得他们是one2many双向关系,应该如何实现呢?


首先,修改Classroom.java和Classroom.hbm.xml映射文件

package org.zttc.itat.model;
 
import java.util.Set;
 
public class Classroom {
    private int id;
    private String name;
    private int grade;
    private Set<Student> stus;
    //set get 方法省略
}
<?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="Classroom" table="t_cla">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <property name="grade"/>
        <!-- inverse=true表示不再自己这一端维护关系 -->
        <set name="stus" lazy="extra" inverse="true">
            <key column="cid"/>
            <one-to-many class="Student"/>
        </set>
    </class>
</hibernate-mapping>

看看测试类:

@Test
public void testAdd01() {
    Session session = null;
    try {
        session = HibernateUtil.openSession();
        session.beginTransaction();
        Student stu1 = new Student();
        stu1.setName("猪八戒");
        stu1.setNo("1111");
        session.save(stu1);
        Student stu2 = new Student();
        stu2.setName("朱纠结");
        stu2.setNo("2222");
        session.save(stu2);
        Classroom cla = new Classroom();
        cla.setGrade(2012);
        cla.setName("计算机应用技术");
        Set<Student> stus = new HashSet<Student>();
        stus.add(stu1); stus.add(stu2);
        cla.setStus(stus);
        session.save(cla);
        /*
         * 此时也会发出5条sql(三条添加,两条更新),
         * 所以最佳实践就是不要使用1的一方来维护关系
         * 在配置文件的set标签中可以通过inverse=true
         * 来明确不使用一的这一端维护关系(此时只有三天添加SQL)
         */
        session.getTransaction().commit();
    } catch (Exception e) {
        e.printStackTrace();
        if(session!=null) session.getTransaction().rollback();
    } finally {
        HibernateUtil.close(session);
    }
}
 
@Test
public void testAdd02() {
    Session session = null;
    try {
        session = HibernateUtil.openSession();
        session.beginTransaction();
        //先添加一,再添加多
        Classroom cla = new Classroom();
        cla.setGrade(2012);
        cla.setName("计算机网络技术");
        session.save(cla);
        Student stu1 = new Student();
        stu1.setName("猪八戒");
        stu1.setNo("1111");
        stu1.setClassroom(cla);
        session.save(stu1);
        Student stu2 = new Student();
        stu2.setName("朱纠结");
        stu2.setNo("2222");
        stu2.setClassroom(cla);
        session.save(stu2);
        session.getTransaction().commit();
    } catch (Exception e) {
        e.printStackTrace();
        if(session!=null) session.getTransaction().rollback();
    } finally {
        HibernateUtil.close(session);
    }
}
 
@Test
public void testLoad02() {
    Session session = null;
    try {
        session = HibernateUtil.openSession();
        session.beginTransaction();
//          Classroom cla = (Classroom)session.load(Classroom.class, 6);
//          会执行一条select count(id)..的语句
//          System.out.println(cla.getStus().size());
        Student stu = (Student)session.load(Student.class, 15);
        System.out.println(stu.getName()+","+stu.getClassroom().getGrade());
        session.getTransaction().commit();
    } catch (Exception e) {
        e.printStackTrace();
        if(session!=null) session.getTransaction().rollback();
    } finally {
        HibernateUtil.close(session);
    }
}


本文链接:hibernate中one2Many双向,由领悟书生原创(笔记),转载请注明出处http://www.656463.com/article/399

相关问答

更多