Hibernate关联映射--一对多映射
来源:互联网 发布:网络管理的协议 编辑:程序博客网 时间:2024/05/22 06:24
映射类型(4种):
常见的及常用的:一对多、多对一。
一对多映射(one-to-many):
如何表示一对多的关联关系:
例子:一个班级对应多个学生。在班级中定义一个学生的集合。
在数据库中创建表student(学生表)和grade(班级表)
hibernate.cfg.xml(注意指定映射文件的路径):
<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><!-- Generated by MyEclipse Hibernate Tools. --><hibernate-configuration> <session-factory> <property name="dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="connection.url"> jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characterEncoding=UTF-8 </property> <property name="connection.username">root</property> <property name="connection.password">123456</property> <property name="connection.driver_class"> com.mysql.jdbc.Driver </property> <property name="myeclipse.connection.profile">mysql</property> <property name="show_sql">true</property> <property name="format_sql">true</property> <property name="hbm2ddl.auto">update</property> <property name="hibernate.current_session_context_class">thread</property> <!-- 指定映射文件的路径 --> <mapping resource="com/entity/Grade.hbm.xml" /> <mapping resource="com/entity/Student.hbm.xml" /> </session-factory></hibernate-configuration>
创建实体类student和grade(注意实现Serializable接口):
package com.entity;import java.io.Serializable;public class Student implements Serializable{ private int sid; //学生编号 private String sname; //学生姓名 private String sex; //学生性别 public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Student() { super(); } public Student(String sname, String sex) { super(); this.sname = sname; this.sex = sex; }}
package com.entity;import java.io.Serializable;import java.util.HashSet;import java.util.Set;public class Grade implements Serializable { private int gid; //班级编号 private String gname; //班级名称 private String gdesc; //班级详细信息 //建立一对多的关联关系:在一方(班级)定义一个多方(学生)的集合 private Set<Student> students=new HashSet<Student>(); //set集合元素不允许重复,元素没有顺序 public int getGid() { return gid; } public void setGid(int gid) { this.gid = gid; } public String getGname() { return gname; } public void setGname(String gname) { this.gname = gname; } public String getGdesc() { return gdesc; } public void setGdesc(String gdesc) { this.gdesc = gdesc; } public Set<Student> getStudents() { return students; } public void setStudents(Set<Student> students) { this.students = students; } public Grade() { super(); // TODO Auto-generated constructor stub } public Grade(int gid, String gname, String gdesc, Set<Student> students) { super(); this.gid = gid; this.gname = gname; this.gdesc = gdesc; this.students = students; } public Grade(String gname, String gdesc) { super(); this.gname = gname; this.gdesc = gdesc; }}
Student.hbm.xml:
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping> <class name="com.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" type="java.lang.String"> <column name="sex"></column> </property> </class> </hibernate-mapping>
Grade.hbm.xml(注意配置单向的一对多关联关系用到Set):
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping> <class name="com.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" type="java.lang.String"> <column name="gdesc"></column> </property> <!-- 配置单向的一对多关联关系 --> <set name="students" table="student"> <!-- 指定关联的外键列 --> <key column="gid"></key> <one-to-many class="com.entity.Student"></one-to-many> </set> </class></hibernate-mapping>
创建一个工具类HibernateUtil用于初始化hibernate、获取会话工厂和会话 、关闭会话:
package com.util;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.boot.registry.StandardServiceRegistry;import org.hibernate.boot.registry.StandardServiceRegistryBuilder;import org.hibernate.cfg.Configuration;//工具类:初始化hibernate、获取会话工厂和会话 、关闭会话public class HibernateUtil { private static SessionFactory sessionFactory; //会话工厂 private static Session session;//会话 //静态代码块 static{ //初始化 //创建Configuration对象,读取hibernate.cfg.xml文件,完成初始化 Configuration config=new Configuration().configure(); StandardServiceRegistryBuilder ssrb=new StandardServiceRegistryBuilder() .applySettings(config.getProperties()); //StandardServiceRegistryBuilder:hibernate4.3之后才有 StandardServiceRegistry ssr=ssrb.build(); sessionFactory=config.buildSessionFactory(ssr); } //获取SessionFactory public static SessionFactory getSessionFactory(){ return sessionFactory; } //获取Session public static Session getSession(){ session=sessionFactory.openSession(); return session; } //关闭Session public static void closeSession(Session session){ //参数是要关闭的session if(session!=null){ session.close(); } }}
测试类Test,实现增删改查:
package com.entity;import java.util.Set;import org.hibernate.Session;import org.hibernate.Transaction;import com.util.HibernateUtil;/** * 单向一对多关联关系(班级(一方)指向学生(多方)) * 建立关联关系后,可以方便的从一个对象导航到另一个对象(注意是单向关联) * */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); //关闭session } //查询班级中包含的学生信息 public static void findStudentsByGrade(){ Session session=HibernateUtil.getSession(); //获得session Grade grade=(Grade) session.get(Grade.class,1); //获取一个班级信息(本例查询ID为1的班级) System.out.println(grade.getGname()+","+grade.getGdesc()); //得到学生集合 Set<Student> students=grade.getStudents(); for (Student student : students) { System.out.println(student.getSname()+","+student.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); //获取id为1的学生信息 g.getStudents().add(stu); session.save(g); tx.commit(); //提交事务 HibernateUtil.closeSession(session); //关闭session } //删除学生信息 public static void delete(){ Session session=HibernateUtil.getSession(); //得到会话 Transaction tx=session.beginTransaction(); //开启事务 //获得学生信息 Student stu=(Student) session.get(Student.class, 2); //获取id为2的学生信息 //删除这个学生 session.delete(stu); tx.commit(); HibernateUtil.closeSession(session); }}
执行add方法,数据库:
grade表:
student表:
执行查询方法,控制台:
执行update,数据库:
grade表:
student表:
执行delete,数据库:
grade表:
student表:
Set元素的常用属性:
单向的一对多映射通过在一方定义一个多方的集合。在映射文件中通过Set元素进行一对多映射的配置。
0 0
- Hibernate一对多关联映射
- hibernate---->一对多关联映射
- Hibernate一对多关联映射
- hibernate关联映射(一对多)
- hibernate---一对多关联映射
- 【Hibernate】一对多关联映射
- 【Hibernate】一对多关联映射
- Hibernate关联映射--一对多
- Hibernate一对多关联映射
- Hibernate关联映射--一对多映射
- Hibernate一对一关联映射和一对多关联映射
- Hibernate一对多单向关联映射
- Hibernate一对多关联双向映射
- Hibernate映射一对多单向关联(之一)
- Hibernate一对多关联映射—单向
- Hibernate 映射一对多关联关系
- hibernate一对多关联映射—单向
- hibernate一对多关系映射(自身关联)
- 并查集初阶:畅通工程问题
- for-each 语句
- HDU2509 Be the Winner Nim博弈
- Gym 100886G Maximum Product(搜索)
- Qt:程序异常退出
- Hibernate关联映射--一对多映射
- Java(继承的使用)
- C++ unique_ptr
- iOS 用KVC来自定义Tabbar
- windows,网络层次模型
- 后缀树
- java中的equals()
- 操作符优先级
- LeetCode338. Counting Bits