hibernate实体类映射关系梳理

###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);
}
相关文章
相关标签/搜索