昨天已在此写过代码的反向生成
可以参照: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