Hibernate(四)一对多映射 补充三:双向多对一关系(学生-->班级)
2017-07-12 14:34
567 查看
数据库及其他文件见hibernate(四)一对多映射 补充一:单向一对多关系(班级->学生)
优化一:修改在one的一方set标签中添加inverse=”true”
优化二:保存班级的时候级联保存学生信息
cascade属性
1.all 对所有的操作进行级联操作
2.save-update 执行保存和更新操作时进行级联操作
3.delete 执行删除时进行级联操作
4.none 对所有操作不进行级联操作
package com.imooc.entity; import java.io.Serializable; import java.util.HashSet; import java.util.Set; /** * 班级 * @author Administrator * */ public class Grade implements Serializable{ /** * */ private static final long serialVersionUID = 1L; private int gid; private String gname; private String gdesc; //在一方定义一个多方的集合 private Set<Student> students = new HashSet<Student>(); public Grade() { super(); } public Grade(String gname, String gdesc) { super(); this.gname = gname; this.gdesc = gdesc; } public Grade(int gid, String gname, String gdesc, Set<Student> students) { super(); this.gid = gid; this.gname = gname; this.gdesc = gdesc; } 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; } }
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.imooc.entity.Grade" table="grade" > <id name="gid" column="gid" type="java.lang.Integer"> <generator class="increment"></generator><!--increment Hibernate自增 --> </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> </hibernate-mapping>
package com.imooc.entity; /** * 学生 * @author Administrator * */ public class Student { public Student(String sname, String sex) { super(); this.sname = sname; this.sex = sex; } public Student() { super(); } private int sid; private String sname; private String sex; private Grade grade; 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 Grade getGrade() { return grade; } public void setGrade(Grade grade) { this.grade = grade; } }
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.imooc.entity.Student" table="student" > <id name="sid" column="sid" type="java.lang.Integer"> <generator class="increment"></generator><!--increment Hibernate自增 --> </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"></many-to-one> </class> </hibernate-mapping>
package com.imooc.entity; import java.util.Set; import org.hibernate.Session; import org.hibernate.Transaction; import com.imooc.util.HibernateUtil; /** * 双向多对一关系(学生--》班级) * @author Administrator * */ 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("慕女神","女"); //设置关联关系 stu1.setGrade(g); stu2.setGrade(g); 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); } } /*console执行结果: 下面两条update是赘余的浪费性能,不需要去更新student的gid在student在已经设置。所以可以在one的一方set标签中添加inverse="true",表示由多的一方负责维护关联关系。 Hibernate: select max(gid) from grade Hibernate: select max(sid) from student Hibernate: insert into grade (gname, gdesc, gid) values (?, ?, ?) Hibernate: insert into student (sname, sex, gid, sid) values (?, ?, ?, ?) Hibernate: insert into student (sname, sex, gid, sid) values (?, ?, ?, ?) Hibernate: update student set gid=? where sid=? Hibernate: update student set gid=? where sid=? */
优化一:修改在one的一方set标签中添加inverse=”true”
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.imooc.entity.Grade" table="grade" > <id name="gid" column="gid" type="java.lang.Integer"> <generator class="increment"></generator><!--increment Hibernate自增 --> </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>节点的inverse属性指定关联关系的控制方向,默认由one方来维护 关联关系中,inverse="false"则为主动方,由主动方负责维护关联关系 在一对多关联中,只能设置one方的inverse为true,这将有助于性能的改善 --> <set name="students" table="student" inverse="true"> <key column="gid"></key> <one-to-many class="com.imooc.entity.Student"/> </set> </class> </hibernate-mapping> /* console:执行结果为: Hibernate: select max(gid) from grade Hibernate: select max(sid) from student Hibernate: insert into grade (gname, gdesc, gid) values (?, ?, ?) Hibernate: insert into student (sname, sex, gid, sid) values (?, ?, ?, ?) Hibernate: insert into student (sname, sex, gid, sid) values (?, ?, ?, ?) */
优化二:保存班级的时候级联保存学生信息
cascade属性
1.all 对所有的操作进行级联操作
2.save-update 执行保存和更新操作时进行级联操作
3.delete 执行删除时进行级联操作
4.none 对所有操作不进行级联操作
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.imooc.entity.Grade" table="grade" > <id name="gid" column="gid" type="java.lang.Integer"> <generator class="increment"></generator><!--increment Hibernate自增 --> </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>节点的inverse属性指定关联关系的控制方向,默认由one方来维护 关联关系中,inverse="false"则为主动方,由主动方负责维护关联关系 在一对多关联中,只能设置one方的inverse为true,这将有助于性能的改善 cascade="save-update" 保存和更新时级联操作 --> <set name="students" table="student" inverse="true" cascade="save-update"> <key column="gid"></key> <one-to-many class="com.imooc.entity.Student"/> </set> </class> </hibernate-mapping>
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.imooc.entity.Student" table="student" > <id name="sid" column="sid" type="java.lang.Integer"> <generator class="increment"></generator><!--increment Hibernate自增 --> </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> <!-- 配置多对一关联关系 cascade="all" 增删改查student级联操作grade--> <many-to-one name="grade" class="com.imooc.entity.Grade" column="gid" cascade="all"></many-to-one> </class> </hibernate-mapping>
package com.imooc.entity; import java.util.Set; import org.hibernate.Session; import org.hibernate.Transaction; import com.imooc.util.HibernateUtil; /** * 双向多对一关系(学生--》班级) * @author Administrator * */ 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("慕女神","女"); //设置关联关系 stu1.setGrade(g); stu2.setGrade(g); g.getStudents().add(stu1); g.getStudents().add(stu2); Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); //保存班级时级联保存学生信息 session.save(g); tx.commit(); HibernateUtil.closeSession(session); } //查询学生所在班级信息 public static void findGradeByStudent(){ Session session = HibernateUtil.getSession(); //学生信息 Student student = (Student) session.get(Student.class, 2); System.out.println(student.getSid()+","+student.getSname()); //班级信息 配置级联关系后直接.出来 Grade grade = student.getGrade(); System.out.println(grade.getGid()+","+grade.getGname()); } } /* console:执行结果: Hibernate: select student0_.sid as sid1_1_0_, student0_.sname as sname2_1_0_, student0_.sex as sex3_1_0_, student0_.gid as gid4_1_0_ from student student0_ where student0_.sid=? 2,慕女神 Hibernate: select grade0_.gid as gid1_0_0_, grade0_.gname as gname2_0_0_, grade0_.gdesc as gdesc3_0_0_ from grade grade0_ where grade0_.gid=? 1,JAVA一班 */
相关文章推荐
- Hibernate(四)一对多映射 补充二:单向多对一关系(学生->班级)
- Hibernate(四)一对多映射 补充一:单向一对多关系(班级->学生)
- Hibernate-映射关系- 1<->n(双向)
- Hibernate中的one2one的单双向关系映射
- hibernate多对多关联映射(双向User--->Role)
- Hibernate双向一对一,一对多,多对多关系映射
- hibernate 关系映射之 双向外键关联一对一
- Hibernate关系映射(4)_一对一双向主键关联
- Hibernate教程07_关系映射之一对一双向主键关联
- hibernate映射关系 一对多、多对一单向关联 一对多双向关联
- hibernate映射关系之一对一双向主键关联
- Hibernate进阶之组件类型认识和双向一对多关系混合映射
- Hibernate关系映射(9)_多对一双向关联
- hibernate---->对象/关系数据库映射基础
- Hibernate笔记=>继承关系的映射
- hibernate 映射<四>多对一双向映射
- hibernate映射一对多,双向关系,初学例子三
- Hibernate教程05_关系映射之一对一双向外键关联
- Hibernate进阶之双向一对多关系映射
- hibernate 映射<五>多对多双向映射