###1,单向一对多 (站在班级的角度) 在数据库中,能够经过添加主外键的关联,表现一对多关系,例如班级对应学生 经过在一方持有多方的集合实现,即在“一"的一端中使用<set>元素表示持用”多“的一端对象。java
public class Grade implements Serializable { private int gid; private String gname; private String gdesc; private Set<Student> students; }数据库
public class Student implements Serializable { private int sid; private String sname; private String sex; }session
<set>集合是表示不能重复的。只须要在class中配置one-to-many指向,而不须要在student中再配置。以下:
<!-- 配置一对多关联关系 --> <set name="students" table="student"> <key column="gid"></key> <one-to-many class="com.imooc.entity.Student"/> </set>
测试添加学生:app
//将学生添加到班级 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元素经常使用属性:lazy赖加载,或者延迟加载;inverse反向;hibernate
它与关系数据库中外键参考关系最匹配,即在一的一方的表中一个外键参照另外一个表的主键. 经过在多方持有一方的引用实现,须要在"多"的一端使用<many-to_one>配置.
实体类:code
public class Student implements Serializable { private int sid; private String sname; private String sex; // 在多方定义一个一方的引用 private Grade grade; }对象
public class Grade implements Serializable { private int gid; private String gname; private String gdesc; private Set<Student> students; }开发
在学生端配置
<hibernate-mapping> <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> </hibernate-mapping>
###2 双向关联关系. 同时在多的一端和一的一端配置信息. .,
####inverse 若是双方都来维护他们之间的关系的话,性能上就会产生影响,这个时候,就须要inverse属性,交个一方维护关系 <set>节点的inverse属性指定关联控制方向,默认由one的一方来控制.默认由"one"方来维护,默认为false,能够将invserse设置为true,由多方来维护关联关系.一方不须要维护.
####cascade级联操做 默认为none,他不为none时,自动级联全部操做它所关联的对象.例如保存班级的时候,本身级联操做学生.
//保存 public static void save(){ Grade g=new Grade("Java一班","Java软件开发一班"); Student stu1=new Student("慕女神", "女"); Student stu2=new Student("小慕慕", "男");
//设置关联关系 g.getStudents().add(stu1); g.getStudents().add(stu2); stu1.setGrade(g); stu2.setGrade(g); Session session=HibernateUtil.getSession(); Transaction tx=session.beginTransaction(); session.save(g);
//有了cascade就不须要下面两句.
session.save(stu1);
session.save(stu2); tx.commit(); HibernateUtil.closeSession(session); }