您的位置:首页 > 编程语言 > Java开发

hibernate一对多关联映射(二)---双向关联

2008-12-02 09:53 295 查看
1.新建工程项目hibernate_one2many_2,在该项目下添加hibernate所需的Jar包和数据库mysql驱动Jar包。

2.编写工具类HibernateUtils和ExportDB,代码如下:

    HibernateUtils.java

package com.i51pro.hibernate;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

public class HibernateUtils {

    private static SessionFactory sessionFactory;

    static {

        try {

            Configuration cfg = new Configuration().configure();

            sessionFactory = cfg.buildSessionFactory();

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

    public static SessionFactory getSessionFactory() {

        return sessionFactory;

    }

    public static Session getSession() {

        return sessionFactory.openSession();

    }

    public static void closeSession(Session session) {

        if (session != null) {

            if (session.isOpen()) {

                session.close();

            }

        }

    }

}

    ExportDB.java

package com.i51pro.hibernate;

import org.hibernate.cfg.Configuration;

import org.hibernate.tool.hbm2ddl.SchemaExport;

public class ExportDB {

    /**

     * @param args

     */

    public static void main(String[] args) {

        Configuration cfg = new Configuration().configure();

        

        SchemaExport export = new SchemaExport(cfg);

        export.create(true, true);

    }

}

 

3.编写实体类和映射文件,代码如下:

    Student.java

 

package com.i51pro.hibernate;

public class Student {

    private int id;

    

    private String name;

    private Classes classes;

    

    public int getId() {

        return id;

    }

    public void setId(int id) {

        this.id = id;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public Classes getClasses() {

        return classes;

    }

    public void setClasses(Classes classes) {

        this.classes = classes;

    }

}

<
4000
/span>

     Classes.java

package com.i51pro.hibernate;

import java.util.Set;

public class Classes {

    private int id;

    

    private String name;

    

    private Set students;

    public int getId() {

        return id;

    }

    public void setId(int id) {

        this.id = id;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public Set getStudents() {

        return students;

    }

    public void setStudents(Set students) {

        this.students = students;

    }

}

    Student.hbm.xml

<?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>

    <class name="com.i51pro.hibernate.Student" table="t_student">

        <id name="id">

            <generator class="native"/>

        </id>

        <property name="name" />

        <many-to-one name="classes" column="classesid" />

    </class>

</hibernate-mapping>

    Classes.hbm.xml

<?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>

    <class name="com.i51pro.hibernate.Classes" table="t_classes">

        <id name="id">

            <generator class="native" />

        </id>

        <property name="name"/>

        <set name="students" inverse="true" cascade="all">

            <key column="classesid" />

            <one-to-many class="com.i51pro.hibernate.Student"/>

        </set>

    </class>

</hibernate-mapping>

4.编写hibernate映射文件,代码如下:

<!DOCTYPE hibernate-configuration PUBLIC

    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate_one2many_2</property>

        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

        <property name="hibernate.connection.username">root</property>

        <property name="hibernate.connection.password">admin</property>

        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

        <property name="hibernate.show_sql">true</property>

        

        <mapping resource="com/i51pro/hibernate/Student.hbm.xml"/>

        <mapping resource="com/i51pro/hibernate/Classes.hbm.xml"/>

    </session-factory>

</hibernate-configuration>

4.在工程项目hibernate_one2many_2下,建立SourceFolder,命名为test,在该包下编写测试类One2ManyTest,进行单元测试,代码如下:

package com.i51pro.hibernate;

import java.util.HashSet;

import java.util.Iterator;

import java.util.Set;

import org.hibernate.Session;

import org.hibernate.Transaction;

import junit.framework.TestCase;

public class One2ManyTest extends TestCase {

    public void testSave1() {

        Session session = null;

        try {

            session = HibernateUtils.getSession();

            Transaction tx = session.beginTransaction();

            

            Student student1 = new Student();

            student1.setName("学生1");

            session.save(student1);

            

            Student student2 = new Student();

            student2.setName("学生2");

            session.save(student2);

            

            Set students = new HashSet();

            students.add(student1);

            students.add(student2);

            

            Classes classes = new Classes();

            classes.setName("JAVA学习小组");

            classes.setStudents(students);

            

            //可以保存 

            session.save(classes);

            

            session.getTransaction().commit();

        }catch(Exception e) {

            e.printStackTrace();

            session.getTransaction().rollback();

        }finally {

            HibernateUtils.closeSession(session);                           

        }

    }

    

    public void testSave2() {

        Session session = null;

        try {

            session = HibernateUtils.getSession();

            Transaction tx = session.beginTransaction();

            

            Classes classes = new Classes();

            classes.setName("JAVA研发小组");

            session.save(classes);

            

            Student student1 = new Student();

            student1.setName("程序员1");

            student1.setClasses(classes);

            session.save(student1);

            

            Student student2 = new Student();

            student2.setName("程序员2");

            student2.setClasses(classes);

            session.save(student2);

            

            session.getTransaction().commit();

        }catch(Exception e) {

            e.printStackTrace();

            session.getTransaction().rollback();

        }finally {

            HibernateUtils.closeSession(session);                           

        }

    }

    

    public void testSave3() {

        Session session = null;

        try {

            session = HibernateUtils.getSession();

            Transaction tx = session.beginTransaction();

            

            Classes classes = new
b9b5
 Classes();

            classes.setName("JAVA研发开小组");

            

            Student student1 = new Student();

            student1.setName("程序员1");

            student1.setClasses(classes);

            

            Student student2 = new Student();

            student2.setName("程序员2");

            student2.setClasses(classes);

            

            Set students = new HashSet();

            students.add(student1);

            students.add(student2);

            

            classes.setStudents(students);

            

            //可以正确保存

            session.save(classes);

            

            session.getTransaction().commit();

        }catch(Exception e) {

            e.printStackTrace();

            session.getTransaction().rollback();

        }finally {

            HibernateUtils.closeSession(session);                           

        }

    }

    

    public void testLoad1() {

        Session session = null;

        try {

            session = HibernateUtils.getSession();

            session.beginTransaction();

            

            Classes classes = (Classes)session.load(Classes.class, 2);

            System.out.println("classes.name=" + classes.getName());

            Set students = classes.getStudents();

            for (Iterator iter=students.iterator(); iter.hasNext();) {

                Student student = (Student)iter.next();

                System.out.println("student.name=" + student.getName());

            }

            session.getTransaction().commit();

        }catch(Exception e) {

            e.printStackTrace();

            session.getTransaction().rollback();

        }finally {

            HibernateUtils.closeSession(session);

        }

    }       

    

    public void testLoad2() {

        Session session = null;

        try {

            session = HibernateUtils.getSession();

            session.beginTransaction();

            

            Student student = (Student)session.load(Student.class, 1);

            System.out.println("student.name=" + student.getName());

            System.out.println("student.classes.name=" + student.getClasses().getName());

            session.getTransaction().commit();

        }catch(Exception e) {

            e.printStackTrace();

            session.getTransaction().rollback();

        }finally {

            HibernateUtils.closeSession(session);

        }

    }       

}

 

总结:hihernate一对多关联映射(双向Classes<----->Student)

一对多双向关联映射:
 * 在一一端的集合上使用<key>,在对方表中加入一个外键指向一一端
 * 在多一端采用<many-to-one>
 
注意:<key>标签指定的外键字段必须和<many-to-one>指定的外键字段一致,否则引用字段的错误
 
如果在”一“一端维护一对多关联关系,hibernate会发出多余的udpate语句,所以我们一般在多
的一端来维护关联关系

关于inverse属性:
 inverse主要用在一对多和多对多双向关联上,inverse可以被设置到集合标签<set>上,
 默认inverse为false,所以我们可以从”一“一端和”多“一端维护关联关系,
 如果设置成inverse为true,则我们只能从多一端来维护关联关系
 
 注意:inverse属性,只影响数据的存储,也就是持久化
  
inverse和cascade
 * inverse是关联关系的控制方向
 * cascade操作上的连锁反应
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息