###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); }