hibernate one2many (單向關聯)
阿新 • • 發佈:2017-10-27
集合 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 (單向關聯)