hibernate学习4之one-to-many单向关联(不推荐)

来源:互联网 发布:李米的猜想知乎 编辑:程序博客网 时间:2024/06/17 17:27
一对多和多对一的映射策略是一样的,只是站的角度不同.

多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一
一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多

先上配置文件:
<!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_1</property><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">bjsxt</property><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><property name="hibernate.show_sql">true</property><mapping resource="com/bjsxt/hibernate/Classes.hbm.xml"/><mapping resource="com/bjsxt/hibernate/Student.hbm.xml"/></session-factory></hibernate-configuration>

public class Student {private int id;private String name;//setter,getter}

import java.util.Set;public class Classes {private int id;private String name;private Set students; //一对多,一个班级对应很多学生//setter,getter}

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.bjsxt.hibernate.Student" table="t_student"><id name="id"><generator class="native"/></id><property name="name"/></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.bjsxt.hibernate.Classes" table="t_classes"><id name="id"><generator class="native"/></id><property name="name"/><set name="students"><key column="classesid"/><one-to-many class="com.bjsxt.hibernate.Student"/></set></class></hibernate-mapping>

上面这个配置在Student一端加入了一个classesid外键;也说明set里存放的是Student对象

测试一下:
import java.util.HashSet;import java.util.Iterator;import java.util.Set;import junit.framework.TestCase;import org.hibernate.Session;public class One2ManyTest extends TestCase {public void testSave1() {Session session = null;try {session = HibernateUtils.getSession();session.beginTransaction();Student student1 = new Student();student1.setName("10");session.save(student1);//先saveStudent student2 = new Student();student2.setName("祖儿");session.save(student2);//先saveSet students = new HashSet();students.add(student1);students.add(student2);Classes classes = new Classes();classes.setName("尚学堂");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, 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.name=" + student.getName());}session.getTransaction().commit();}catch(Exception e) {e.printStackTrace();session.getTransaction().rollback();}finally {HibernateUtils.closeSession(session);}}}


在一一端维护关系的缺点:
* 如果将t_student表里的classesid字段设置为非空,则无法保存
* 因为不是在student这一端维护关系,所以student不知道是哪个班的,
  所以需要发出多余的update语句来更新关系

因为一对多(单向关联)会发出额外的sql语句,效率没有多对一高,所以通常情况下不采用一对多的单向关联,采用双向关联比较妥当!
0 0
原创粉丝点击