7.6--SSH学习之关联映射
来源:互联网 发布:如何删除mac下载程序 编辑:程序博客网 时间:2024/06/05 00:47
昨天已在此写过代码的反向生成
可以参照:http://blog.csdn.net/su1573/article/details/74509201
今天来记下学习的关联映射:
一对一,一对多,单向多对一,双向多对一,多对多
- 一对一关联映射
用两张表,一个学生表,一个教师表,关系:一个老师 单独辅导一个学生哦(1000/h)
属性分别为:
Student.java private Integer stuId; private String stuName; private String stuGender; private Integer stuAge; private Teacher teacher;
Teacher,java private Integer teacherId; private String teacherName; private String teacherPwd; private Integer teacherLevel; private Student student;
配置文件分别为:
Student.hbm.xml <class name="Student" table="STU_TAB"> <id name="stuId" column="STU_ID"> <generator class="native"/> </id> <property name="stuName" column="STU_NAME"/> <property name="stuGender" column="STU_GENDER"/> <property name="stuAge" column="STU_AGE"/> </class>
Teacher.hbm.xml <class name="Teacher" table="TEA_TAB"> <id name="teacherId" column="TEA_ID"> <generator class="native"/> </id> <property name="teacherName" column="TEA_NAME" not-null="true"/> <property name="teacherPwd" column="TEA_PWD" not-null="true"/> <property name="teacherLevel" column="TEA_LEVEL" not-null="true"/> <many-to-one name="student" class="Student" column="STU_ID" cascade="save-update" lazy="false" unique="true"></many-to-one> </class>
根据配置文件在数据库自动建表需要用到Configuration和SchemaExport代码如下:
public static void main(String[] args) { // 默认读取hibernate.cfg.xml文件 Configuration cfg = new Configuration().configure(); // 生成并输出sql到文件(当前目录)和数据库 SchemaExport se = new SchemaExport(cfg); // 创建表结构,第一个true 表示在控制台打印sql语句,第二个true 表示导入sql语句到数据库 se.create(true, true); }
测试数据如下:
public static void main(String[] args) { // TODO Auto-generated method stub StudentDao stuDao = new StudentDaoImpl();// Student stu = new Student(); //增加信息// stu.setStuName("苏");// stu.setStuGender("男");// stu.setStuAge(21);// // stuDao.addStudent(stu);// Student stu = stuDao.findStudentById(2); //通过id查询// System.out.println(stu.getStuName()); List<Student> list = stuDao.findAllStudent(); //列出全部信息 for(Student stu : list){ System.out.println(stu.getStuName()); } }
用两张表,一张学生表,一张班级表,关系:一个班级可以有多个学生
属性如下:
Student.java private Integer stuId; private String stuName; private String stuGender; private Integer stuAge; private Integer clasesId;
Classes.java private Integer classesId; private String classesName; private Set<Student> stuSet = new HashSet<Student>();
配置文件分别为:
Student.hbm.xml <class name="Student" table="STU_TAB"> <id name="stuId" column="STU_ID"> <generator class="native"/> </id> <property name="stuName" column="STU_NAME"/> <property name="stuGender" column="STU_GENDER"/> <property name="stuAge" column="STU_AGE"/> <property name="classesId" column="CLA_ID"/> </class>
Classes.hbm.xml <class name="Classes" table="CLA_TAB"> <id name="classesId" column="CLA_ID"> <generator class="native"/> </id> <property name="classesName" column="CLA_NAME"/> <set name="stuSet" cascade="save-update"> <key column="CLA_ID"></key> <one-to-many class="Student"/> </set> </class>
用两张表,一个学生表,一个班级表,关系:多个学生在同一班级
属性分别为:
Student.java private Integer stuId; private String stuName; private String stuGender; private Integer stuAge; private Classes classes;
Classes.java private Integer classesId; private String classesName;
配置文件分别为:
Student.hbm.xml <class name="Student" table="STU_TAB"> <id name="stuId" column="STU_ID"> <generator class="native"/> </id> <property name="stuName" column="STU_NAME"/> <property name="stuGender" column="STU_GENDER"/> <property name="stuAge" column="STU_AGE"/> <many-to-one name="classes" class="Classes" column="CLA_ID" cascade="save-update" lazy="false"></many-to-one> </class>
<class name="Classes" table="CLA_TAB"> <id name="classesId" column="CLA_ID"> <generator class="native"/> </id> <property name="classesName" column="CLA_NAME"/> </class>
测试数据如下:
public static void main(String[] args) { // TODO Auto-generated method stub try{ //解析配置文件 Configuration cfg = new Configuration().configure(); //创建SessionFactory对象 SessionFactory sf= cfg.buildSessionFactory(new StandardServiceRegistryBuilder() .applySettings(cfg.getProperties()).build()); //有SessionFactory对象生成Session对象(用Session对象执行数据库表的增删改查) Session session = sf.openSession(); //事务开始(Hibernate强制所有的数据库操作都必须在事务中进行,所以开启事务才能执行相关操作) session.beginTransaction(); StudentDao std = new StudentDaoImpl(); Classes cs = new Classes(); cs.setClassesName("武术班"); Classes cs1 = new Classes(); cs1.setClassesName("绘画班"); Student stu = new Student(); stu.setStuName("su"); stu.setStuGender("male"); stu.setStuAge(23); stu.setClasses(cs); Student stu1 = new Student(); stu1.setStuName("liu"); stu1.setStuGender("female"); stu1.setStuAge(20); stu1.setClasses(cs1); Student stu2 = new Student(); stu2.setStuName("he"); stu2.setStuGender("male"); stu2.setStuAge(24); stu2.setClasses(cs); std.addEntity(stu); std.addEntity(stu1); std.addEntity(stu2); session.getTransaction().commit();//事务提交 }catch(Exception e){ e.printStackTrace(); } }
数据库中的数据如下图
和单向多对一的区别就是在配置文件中,两头都要配置
用两张表,一个学生表,一个班级表,关系:多个学生在同一班级
属性分别为:
Student.java private Integer stuId; private String stuName; private String stuGender; private Integer stuAge; private Classes classes;
Classes.java private Integer classesId; private String classesName;
配置文件分别为:
Student.hbm.xml <class name="Student" table="STU_TAB"> <id name="stuId" column="STU_ID"> <generator class="native"/> </id> <property name="stuName" column="STU_NAME" not-null="true"/> <property name="stuGender" column="STU_GENDER"/> <property name="stuAge" column="STU_AGE"/> <many-to-one name="classes" class="Classes" column="CLA_ID" cascade="save-update" lazy="false"></many-to-one> </class>
Classes.hbm.xml <class name="Classes" table="CLA_TAB"> <id name="classesId" column="CLA_ID"> <generator class="native"/> </id> <property name="classesName" column="CLA_NAME" not-null="true"/> <set name="stuSet" cascade="save-update" lazy="false" inverse="true"> <key column="CLA_ID"> </key> <one-to-many class="Student"/> </set> </class>
测试数据如下:
public static void main(String[] args) { // TODO Auto-generated method stub try{ //解析配置文件 Configuration cfg = new Configuration().configure(); //创建SessionFactory对象 SessionFactory sf = cfg.buildSessionFactory(new StandardServiceRegistryBuilder() .applySettings(cfg.getProperties()).build()); //由SessionFactory对象生成Session对象(用Session对象执行对数据表的增删改查) Session session = sf.openSession(); //开启Session事物(Hibernate强制所有的数据库操作都必须在事物中进行,所以开启事务才能执行相关操作) session.beginTransaction(); Student stu = new Student(); stu.setStuName("sanmao"); stu.setStuAge(19); stu.setStuGender("男"); Student stu1 = new Student(); stu1.setStuName("xiaoqiang"); stu1.setStuAge(20); stu1.setStuGender("女"); Student stu2 = new Student(); stu2.setStuName("ruhua"); stu2.setStuAge(21); stu2.setStuGender("女"); Classes classes = new Classes(); classes.setClassesName("跆拳道班");// stu.setClasses(classes);// stu1.setClasses(classes);// stu2.setClasses(classes);// session.save(stu);// session.save(stu1);// session.save(stu2); classes.getStuSet().add(stu); classes.getStuSet().add(stu1); classes.getStuSet().add(stu2); session.save(classes); session.getTransaction().commit(); //session.close(); }catch(Exception ex){ ex.printStackTrace(); } }
在此关联映射中用到了两张表,一个是学生表,一个是教师表。关系,多个生对应多教师
另外,一般用set集合链接另一端,但还有list集合(不推荐,容易出错),以下代码注释的部分为set集合,当练习时可以把有关list集合的注释,放开set集合的代码
属性分别为:
Student.java private Integer stuId; private String stuName; private String stuGender; private Integer stuAge;// private Set<Teacher> teaSet = new HashSet<Teacher>(); private List<Teacher> tealist = new ArrayList<Teacher>();
Teacher.java private Integer teacherId; private String teaName; private String teacherPwd; private Integer teacherLevel;// private Set<Student> stuSet = new HashSet<Student>(); private List<Student> stulist = new ArrayList<Student>();
配置文件分别为:
Student.hbm.xml <class name="Student" table="STU_TAB"> <id name="stuId" column="STU_ID"> <generator class="native"/> </id> <property name="stuName" column="STU_NAME"/> <property name="stuGender" column="STU_GENDER"/> <property name="stuAge" column="STU_AGE"/> <!-- <set name="teaSet" cascade="save-update" lazy="false" table="STU_TEA_TAB"> <key column="STU_ID"></key> <many-to-many class="Teacher" column="TEA_ID"></many-to-many> </set>--> <list name="tealist" cascade="save-update" lazy="false" table="STU_TEA_TAB"> <key column="STU_ID"></key> <list-index column="STU_TEA_INDEX"></list-index> <many-to-many class="Teacher" column="TEA_ID"> </many-to-many> </list> </class>
Teacher.hbm.xml <class name="Teacher" table="TEA_TAB"> <id name="teacherId" column="TEA_ID"> <generator class="native"/> </id> <property name="teaName" column="TEA_NAME" not-null="true"/> <property name="teacherPwd" column="TEA_PWD" not-null="true"/> <property name="teacherLevel" column="TEA_LEVEL" not-null="true"/> <!-- <set name="stuSet" cascade="save-update" lazy="false" table="STU_TEA_TAB" inverse="true"> <key column="TEA_ID"></key> <many-to-many class="Student" column="STU_ID"></many-to-many> </set>--> <list name="stulist" cascade="save-update" table="STU_TEA_TAB" lazy="false" inverse="true"> <key column="TEA_ID"></key> <list-index column="STU_TEA_INDEX"></list-index> <many-to-many class="Student" column="STU_ID"></many-to-many> </list> </class>
测试数据如下:
public static void main(String[] args) { // TODO Auto-generated method stub try{ //解析配置文件 Configuration cfg = new Configuration().configure(); //创建SessionFactory对象 SessionFactory sf= cfg.buildSessionFactory(new StandardServiceRegistryBuilder() .applySettings(cfg.getProperties()).build()); //有SessionFactory对象生成Session对象(用Session对象执行数据库表的增删改查) Session session = sf.openSession(); //事务开始(Hibernate强制所有的数据库操作都必须在事务中进行,所以开启事务才能执行相关操作) session.beginTransaction(); Student stu = new Student(); stu.setStuName("小苏"); stu.setStuGender("男"); stu.setStuAge(23); session.save(stu); Student stu1 = new Student(); stu1.setStuName("小刘"); stu1.setStuGender("女"); stu1.setStuAge(20); session.save(stu1); Student stu2 = new Student(); stu2.setStuName("小张"); stu2.setStuGender("男"); stu2.setStuAge(22); session.save(stu2);// // Teacher teacher = new Teacher();// teacher.setTeaName("王老师");// teacher.setTeacherPwd("111");// teacher.setTeacherLevel(111);// session.save(teacher);// Teacher teacher1 = new Teacher();// teacher1.setTeaName("刘老师");// teacher1.setTeacherPwd("222");// teacher1.setTeacherLevel(222);// session.save(teacher1);// Teacher teacher2 = new Teacher();// teacher2.setTeaName("张老师");// teacher2.setTeacherPwd("333");// teacher2.setTeacherLevel(333);// session.save(teacher2);// //list集合级联增加// stu.getTealist().add(teacher);// stu.getTealist().add(teacher1);// stu.getTealist().add(teacher2);// // stu1.getTealist().add(teacher1);// stu1.getTealist().add(teacher2);// // stu2.getTealist().add(teacher); //先查出学生和老师,再进行增加// Student stu = (Student)session.get(Student.class, 2);// System.out.println("学生"+stu.getStuName()+";");// Teacher tea = (Teacher)session.get(Teacher.class, 4);// System.out.println("想加入"+tea.getTeaName()+"。");// stu.getTealist().add(tea); //set集合级联增加// stu.getTeaSet().add(teacher);// stu.getTeaSet().add(teacher1);// // stu1.getTeaSet().add(teacher2);// // stu2.getTeaSet().add(teacher2);// stu2.getTeaSet().add(teacher);// // session.save(stu);// session.save(stu1);// session.save(stu2); //set通过学生找老师// Student stu = (Student)session.get(Student.class, 1);// System.out.println(stu.getStuName());// Set<Teacher> set = stu.getTeaSet();// for(Teacher tea: set){// System.out.println(tea.getTeaName());// } //set通过老师找学生// Teacher tea = (Teacher)session.get(Teacher.class, 4);// System.out.println(tea.getTeaName());// Set<Student> set = tea.getStuSet();// for(Student stu:set){// System.out.println(stu.getStuName());// } //list通过学生找老师// Student stu = (Student)session.get(Student.class, 1);// System.out.println(stu.getStuName());// List<Teacher> list = stu.getTealist();// for(Teacher teacher:list){// System.out.println(teacher.getTeaName());// } //list通过老师找学生// Teacher tea = (Teacher)session.get(Teacher.class, 6);// System.out.println(tea.getTeaName());// List<Student> list = tea.getStulist();// System.out.println(list.size());// for(Student stu:list){// System.out.println(stu.getStuName());// }// Student stu = (Student)session.get(Student.class, 1);// System.out.println(stu.getStuName());// // stu.setStuName("刘慧娟");// stu.setStuGender("女");// stu.setStuAge(20);// session.delete(stu); //删除 session.getTransaction().commit();//事务提交 }catch(Exception e){ e.printStackTrace(); } }
到此Hibernate的关联映射已介绍完
Author:su1573
阅读全文
0 0
- 7.6--SSH学习之关联映射
- 7.8--SSH学习之注解关联映射
- 【SSH之旅】一步步学习Hibernate框架(二):一对一关联映射中的主键关联
- 【SSH】Hibernate关联映射
- ssh的关联映射
- SSH关联映射注解
- ssh学习之旅(2)--关于hibernate实体映射关联关系映射查询的解决方案-lazy属性惹的祸
- SSH之hibernate—1和n的关联映射
- SSH之hibernate—1:1的关联映射
- Hibernate学习之关联关系映射
- Hibernate学习之---Hibernate的关联映射
- SSH学习之Hibernate的关联关系
- SSH之hibernate学习笔记----关系映射
- 【SSH进阶之路】Hibernate映射——多对一单向关联映射(四)
- 【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)
- 【SSH进阶之路】Hibernate映射——多对一单向关联映射(四)
- 【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)
- 【SSH进阶之路】Hibernate映射——一对多关联映射(七)
- Struts2_OGNL和值栈
- C++中的mutable和volatile
- LeetCode | 60. Permutation Sequence——第K个全排列
- PHP表单数据初步处理
- hashmap冲突的解决方法以及原理分析:
- 7.6--SSH学习之关联映射
- Mybatis源码分析-一级缓存
- Redis遍历所有key的两个命令 -- KEYS 和 SCAN
- Boost算法拓展---几种Boost方法
- 伪Ajax上传文件
- 剑指offer面试题[51]-数组中重复的数字
- nodejs学习笔记(1)
- Flink关系型API简介
- php 变量作用域出现的问题