1、 学生表student 和年级表grade
2、类Student 和Grade类
Student:
1 public class Student { 2 private int id; 3 private String name; 4 private int age; 5 private Grade grade; 6 //get…set 7 }
Grade:
1 public class Grade { 2 private int id; 3 private String name; 4 private Set<Student> students = new HashSet<Student>(0); //get…set 5 }
3、 映射文件
Grade.hbm.xml
1 <hibernate-mapping package="cn.siggy.pojo"> 2 <class name="Grade"> 3 <id name="id"> 4 <generator class="native"></generator> 5 </id> 6 <property name="name"/> 7 <!-- set是 Grade中的集合属性 name属性名称 --> 8 <set name="students"> 9 <!-- key表示外键 column外键列名--> 10 <key column="grade_id"></key> 11 <!-- one-to-many 一对多 类Grade 中 students 所表示类型 --> 12 <one-to-many class="Student"/> 13 </set> 14 </class> 15 </hibernate-mapping>
Student.hbm.xml
1 <hibernate-mapping package="cn.siggy.pojo"> 2 <class name="Student"> 3 <id name="id"> 4 <generator class="native"></generator> 5 </id> 6 <property name="name"/> 7 <property name="age"/> 8 <many-to-one name="grade" class="Grade" column="grade_id" not-null="true"></many-to-one> 9 </class> 10 </hibernate-mapping>
4、 测试代码
@Test public void testSave() throws HibernateException, SerialException, SQLException{ Session session = null; Transaction tx = null; try{ session = HibernateUtil.getSession(); tx = session.beginTransaction(); Grade grade = new Grade(); grade.setName("基础"); Student stu = new Student(); stu.setName("张三疯"); stu.setAge(22); stu.setGrade(grade); Student stu1 = new Student(); stu1.setName("老王"); stu1.setAge(23); stu1.setGrade(grade); //关联 //保存数据的顺序 是根据外键的配置来决定的 //如果外键不能为null,那么先保存一的一端 //如果外键可以为null,则可以随意保存 session.save(grade); session.save(stu); session.save(stu1); 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, 2); System.out.println("gradeName="+grade.getName()); System.out.println("grade所对应的多的一端的数据"); Iterator<Student> iter = grade.getStudents().iterator(); for(;iter.hasNext();){ Student temp = iter.next(); System.out.println("name="+temp.getName()+" age="+temp.getAge()); } System.out.println("========================"); Student stu = (Student)session.get(Student.class, 1); System.out.println("studentname="+stu.getName()+" gradeName="+stu.getGrade().getName()); tx.commit(); }catch (HibernateException e) { if(tx!=null) tx.rollback(); e.printStackTrace(); throw e; }finally{ HibernateUtil.closeSession(); } }
总结:在双向的一对多关联映射中,注意一的一端的配置:<key>中不用指定非空not-null;
如果想要一的一端来维护关系,那么在多的一端不用指定关联列非空。