Hibernate映射关系分析

来源:互联网 发布:java报错 编辑:程序博客网 时间:2024/06/10 21:07


一对多关系


项目源代码


数据库表结果


实体类


xml

Grade.hbm.xml

<class name="com.imooc.entity.Grade" table="grade"><id name="gid" column="gid" type="java.lang.Integer"><generator class="increment"></generator></id><property name="gname" type="java.lang.String"><column name="gname" length="20" not-null="true"></column></property><property name="gdesc"><column name="gdesc"></column></property><!-- 配置一对多关联关系 --><set name="students" table="student"><key column="gid"></key><one-to-many class="com.imooc.entity.Student"/></set></class>

Student.hbm.xml

<class name="com.imooc.entity.Student" table="student"><id name="sid" column="sid" type="java.lang.Integer"><generator class="increment"></generator></id><property name="sname" type="java.lang.String"><column name="sname" length="20" not-null="true"></column></property><property name="sex"><column name="sex"></column></property><!-- 配置多对一关联关系 --><many-to-one name="grade" class="com.imooc.entity.Grade" column="gid" cascade="all"></many-to-one></class>



测试类

public class Test {public static void main(String[] args) {//add();//findStudentsByGrade();//update();delete();}//将学生添加到班级public static void add(){Grade g=new Grade("Java一班", "Java软件开发一班");Student stu1=new Student("张三", "男");Student stu2=new Student("穆女神", "女");//如果希望在学生表中添加对应的班级编号,需要在班级中添加学生,建立关联关系/*g.getStudents().add(stu1);g.getStudents().add(stu2);*/Session session=HibernateUtil.getSession();Transaction tx=session.beginTransaction();session.save(g);session.save(stu1);session.save(stu2);tx.commit();HibernateUtil.closeSession(session);}//查询班级中包含的学生public static void findStudentsByGrade(){Session session=HibernateUtil.getSession();Grade grade=(Grade) session.get(Grade.class, 1);System.out.println(grade.getGname()+","+grade.getGdesc());/*Set<Student> students=grade.getStudents();for(Student stu:students){System.out.println(stu.getSname()+","+stu.getSex());}*/}//修改学生信息public static void update(){Grade g=new Grade("Java二班", "Java软件开发二班");Session session=HibernateUtil.getSession();Transaction tx=session.beginTransaction();Student stu=(Student) session.get(Student.class, 1);//g.getStudents().add(stu);session.save(g);tx.commit();HibernateUtil.closeSession(session);}//删除学生信息public static void delete(){Session session=HibernateUtil.getSession();Transaction tx=session.beginTransaction();Student stu=(Student) session.get(Student.class, 2);session.delete(stu);tx.commit();HibernateUtil.closeSession(session);}}


如果是一对多,单向关联,只配置“一”中,指向“多”的一方的属性。


<set name="students" table="student">
<key column="gid"></key>
<one-to-many class="com.imooc.entity.Student"/>
</set>

如果是多对一,单项关联,只配置“多"中,指向”一“的一方的属性。

<many-to-one name="grade" class="com.imooc.entity.Grade" column="gid" cascade="all"></many-to-one>


如果是双向关联,”一“和”多“的两方都要配置

  • 多对多关系

项目源代码地址

http://download.csdn.net/detail/fulq1234/9871133


数据库表结构


实体类


xml

Projects.xml

<class name="com.imooc.entity.Project" table="project"><id name="proid" column="proid" type="java.lang.Integer"><generator class="assigned"></generator></id><property name="proname" type="java.lang.String"><column name="proname" length="20" not-null="true"></column></property><!-- 配置多对多关联关系 --><set name="employees" table="proemp" cascade="all"><key column="rproid"></key><many-to-many class="com.imooc.entity.Employee" column="rempid"></many-to-many></set></class>


Employee.xml


<class name="com.imooc.entity.Employee" table="employee"><id name="empid" column="empid" type="java.lang.Integer"><generator class="assigned"></generator></id><property name="empname" type="java.lang.String"><column name="empname" length="20" not-null="true"></column></property><!-- 配置多对多关联关系 --><set name="projects" table="proemp" inverse="true"><!-- name:集合属性的名称; table:表名; inverse:定义这个集合是否为双向关联关系中的方向一端--><key column="rempid"></key><!-- column:定义集合所对应的数据库表的外键 --><many-to-many class="com.imooc.entity.Project" column="rproid"></many-to-many><!-- class:指定set中name=projects中存放的对象; column:外键 --></set></class>


测试类

/* * 多对多关联关系的配置 * 同时建立了Project和Employee之间的双向多对多关联关系 * 关联关系的维护交由Project方来处理,并且在保存Project对象时会一并保存Employee对象 */public class Test {public static void main(String[] args) {Project project1=new Project(1001,"项目一");Project project2=new Project(1002,"项目二");Employee employee1=new Employee(1,"慕女神");Employee employee2=new Employee(2,"imooc");//参加项目1的员工有慕女神和imoocproject1.getEmployees().add(employee1);project1.getEmployees().add(employee2);// 参加项目2的员工有慕女神project2.getEmployees().add(employee1);Session session=HibernateUtil.getSession();Transaction tx=session.beginTransaction();session.save(project1);session.save(project2);tx.commit();HibernateUtil.closeSession(session);}}



原创粉丝点击