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);
}
相關文章
相關標籤/搜索