1. 程式人生 > >hibernate one2many (單向關聯)

hibernate one2many (單向關聯)

集合 ssid 就會 try 發出 nts hiberna mit 數據

Classes類:

package com.cnblogs.hibernate_first;

import java.util.Set;

public class Classes {

    private int id;

    private String name;
    
    //hibernate對Set進行了擴展,可以延時加載,在需要的時候才需要查詢SET。比如有1000個學生,當需要的時候才進行加載
    private Set students;

    public Set getStudents() {
        return students;
    }

    
public void setStudents(Set students) { this.students = 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; } }

Student:

public class Student {

    private int id;

    private String name;

    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; } }

classes.hbm.xml

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

<hibernate-mapping package="com.cnblogs.hibernate_first">
    <class name="Classes" table="t_classes">
        <id name="id" column="t_id">
            <generator class="native"></generator>
        </id>
        <property name="name" column="t_name" length="30"/>
        <set name="students">
            <key column="classesid"></key>
            <one-to-many class="com.cnblogs.hibernate_first.Student"/>
        </set>
    </class>
</hibernate-mapping>

student.hbm.xml:

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

<hibernate-mapping package="com.cnblogs.hibernate_first">
    <class name="Student" table="t_student">
        <id name="id" column="t_id">
            <generator class="native"></generator>
        </id>
        <property name="name" column="t_name" length="30"/>
    </class>
</hibernate-mapping>

測試類:

package com.cnblogs.hibernate_first;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import org.hibernate.Session;

import junit.framework.TestCase;

public class One2ManyTest extends TestCase {

    public void testSave1() {
        Session session = null;
        try {
            session = HibernateUtils.getSession();
            session.beginTransaction();
            // 建立關聯
            Student student1 = new Student();
            student1.setName("張三");
            
            Student student2 = new Student();
            student2.setName("李四");
            Classes classes = new Classes();
            classes.setName("動力節點");
            Set<Student> students = new HashSet<Student>();
            students.add(student1);
            students.add(student2);
            classes.setStudents(students);
            //因為student不是持久化狀態,他是Transient狀態
            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();
            session.beginTransaction();
            // 建立關聯
            Student student1 = new Student();
            student1.setName("張三");
            session.save(student1);
            
            Student student2 = new Student();
            student2.setName("李四");
            session.save(student2);
            
            Classes classes = new Classes();
            classes.setName("動力節點");
            Set<Student> students = new HashSet<Student>();
            students.add(student1);
            students.add(student2);
            classes.setStudents(students);
            //因為student不是持久化狀態,他是Transient狀態
            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, 1);
            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 in Classes " + student.getName());
            }
            session.getTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        } finally {
            HibernateUtils.closeSession(session);
        }
    }
}

hibernate 一對多的關聯映射(單向 Classes ——》Student)
hibernate對Set進行了擴展,可以延時加載,在需要的時候才需要查詢SET。比如有1000個學生,當需要的時候才進行加載
一對多和多對一的映射原理是一樣的,都是在多的一端加入一個外鍵指向一的一端
他們的區別在於維護的關系不用
多對一維護的關系:多指向一的關系,如果維護了多指向一的關系,那麽加載多的時候會把一加載上來。
一對多維護的關系:一指向多的關系,如果維護了一指向多的關系,那麽加載一的時候會把一加載上來。

在一的一端維護關系存在缺陷
*因為多的一端Student不知道Classes的存在(也就是Student沒有維護與Classes的關系),所以在保存Student的時候關系字段Classid為null,
如果將該關系字段設置為非空,則將無法保存數據。
*另外因為Student不維護關系,而Classes維護關系,Classes就會發出多余的update語句,保證Classes與Student有關系,,這樣加載Classes的
時候,才能把該Classes對應的學生集合加載上來。

hibernate one2many (單向關聯)