【7.6】基于List集合映射
1.Grade类
package cn.siggy.pojo; import java.util.ArrayList; import java.util.List; public class Grade { private int id; private String name; private List<Student> students = new ArrayList<Student>(0); /*get/set*/ }
2.Student类
package cn.siggy.pojo; public class Student { private int id; private String name; private int age; /*get/set*/ }
3.映射文件
Grade.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.siggy.pojo"> <class name="Grade"> <id name="id"> <generator class="native"></generator> </id> <property name="name"/> <list name="students" cascade="all"> <!-- key表示外键 column外键列名--> <key column="grade_id"></key> <!-- 在多的一端 产生一列 用来表示顺序 如果不指明列名 默认为 idx 值由hibernate来维护 --> <list-index column="sort"/> <!-- one-to-many 一对多 类Grade 中 students 所表示类型 --> <one-to-many class="Student"/> </list> </class> </hibernate-mapping>
Student.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.siggy.pojo"> <class name="Student"> <id name="id" column="sid"> <generator class="native"></generator> </id> <property name="name"/> <property name="age"/> </class> </hibernate-mapping>
4.测试代码
package cn.siggy.test; import java.sql.SQLException; import java.util.List; import javax.sql.rowset.serial.SerialException; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.tool.hbm2ddl.SchemaExport; import org.junit.Test; import cn.siggy.pojo.Grade; import cn.siggy.pojo.Student; import cn.siggy.util.HibernateUtil; public class HibernateTest { @Test public void testCreateDB(){ Configuration cfg = new Configuration().configure(); SchemaExport se = new SchemaExport(cfg); //第一个参数 是否生成ddl脚本 第二个参数 是否执行到数据库中 se.create(true, true); } @Test public void testSave() throws HibernateException, SerialException, SQLException{ Configuration cfg = new Configuration().configure(); SessionFactory factory = cfg.buildSessionFactory(new StandardServiceRegistryBuilder() .applySettings(cfg.getProperties()).build()); Session session = null; Transaction tx = null; try{ session = factory.openSession(); tx = session.beginTransaction(); Grade grade = new Grade(); grade.setName("基础"); Student stu = new Student(); stu.setName("张三疯"); stu.setAge(22); Student stu1 = new Student(); stu1.setName("老王"); stu1.setAge(23); Student stu2 = new Student(); stu2.setName("老李"); stu2.setAge(23); //关联 grade.getStudents().add(stu); grade.getStudents().add(stu1); grade.getStudents().add(stu2); //保存数据的顺序 是根据外键的配置来决定的 //如果外键不能为null,那么先保存一的一端 //如果外键可以为null,则可以随意保存 session.save(grade); session.save(stu); session.save(stu1); session.save(stu2); tx.commit(); }catch (HibernateException e) { if(tx!=null) tx.rollback(); e.printStackTrace(); throw e; }finally{ HibernateUtil.closeSession(); } } @Test public void testGet(){ Session session = null; Transaction tx = null; try{ session = HibernateUtil.getSession(); tx = session.beginTransaction(); //取数据 Grade grade = (Grade)session.get(Grade.class, 1); System.out.println("gradeName="+grade.getName()); System.out.println("grade所对应的多的一端的数据"); List<Student> list = grade.getStudents(); for(Student stu:list){ System.out.println(stu.getName()); } tx.commit(); }catch (HibernateException e) { if(tx!=null) tx.rollback(); e.printStackTrace(); throw e; }finally{ HibernateUtil.closeSession(); } } }
5.测试结果
1.执行testSave()方法:
2.执行testGet():