hibernate中映射文件中的關聯關係——多對一/一對多

雙向關聯:

員工知道所屬部門,部門知道包括哪些員工

1.  package oneTomany;  

3.  import java.util.HashSet;  
4.  import java.util.Set;  

6.  public class Department {  
7.  private int id;  
8.  private String name;  
9.  private Set<Employee> employees=new HashSet<Employee>();  
10.  public int getId() {  
11.  return id;  
12.  }  
13.  public void setId(int id) {  
14.  this.id = id;  
15.  }  
16.  public String getName() {  
17.  return name;  
18.  }  
19.  public void setName(String name) {  
20.  this.name = name;  
21.  }  
22.  public Set<Employee> getEmployees() {  
23.  return employees;  
24.  }  
25.  public void setEmployees(Set<Employee> employees) {  
26.  this.employees = employees;  
27.  }  
28.  @Override  
29.  public String toString() {  
30.  // TODO Auto-generated method stub  
31.  return "[Department:id="+id+",]";  
32.  }  

34.  }  

1.  package oneTomany;  

3.  public class Employee {  
4.  private int id;  
5.  private String name;  
6.  private Department department; // 關聯的對象  
7.  public int getId() {  
8.  return id;  
9.  }  
10.  public void setId(int id) {  
11.  this.id = id;  
12.  }  
13.  public String getName() {  
14.  return name;  
15.  }  
16.  public void setName(String name) {  
17.  this.name = name;  
18.  }  
19.  public Department getDepartment() {  
20.  return department;  
21.  }  
22.  public void setDepartment(Department department) {  
23.  this.department = department;  
24.  }  
25.  @Override  
26.  public String toString() {  
27.  // TODO Auto-generated method stub  
28.  return "[Employee:id="+id+",]";  
29.  }  
30.  }  

Department.hbm.xml

<?xml version="1.0" encoding="gbk"?>  
<!DOCTYPE hibernate-mapping PUBLIC   
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  

<!--   

  This mapping demonstrates   

     (1) a table-per-subclass mapping strategy  

     (2) a simple component mapping  

     (3) recursive associations withing an inheritance tree  

-->  

<hibernate-mapping   package="oneTomany">  
    <!--  
        name:類名  
        table:表名  
    -->  
    <class name="Department" table="t_department">  

        <id name="id" type="int" column="id" >  
            <generator class="native"/> <!--表示自動增長-->  
        </id>  

        <property name="name" type="string" column="name" />  
        <!--employees屬性 ,表達的是本類與Employee類的一對多的關係-->  
        <set name="employees" >  
            <key column="departmentId"></key>  
            <one-to-many class="Employee"></one-to-many>  
        </set>  

    </class>  


</hibernate-mapping>   

Employee.hbm.xml

<?xml version="1.0" encoding="gbk"?>  
<!DOCTYPE hibernate-mapping PUBLIC   
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  

<!--   

  This mapping demonstrates   

     (1) a table-per-subclass mapping strategy  

     (2) a simple component mapping  

     (3) recursive associations withing an inheritance tree  

-->  

<hibernate-mapping   package="oneTomany">  
    <!--  
        name:類名  
        table:表名  
    -->  
    <class name="Employee" table="t_employee">  

        <id name="id" type="int" column="id" >  
            <generator class="native"/> <!--表示自動增長-->  
        </id>  

        <property name="name" type="string" column="name" />  

        <!--Department屬性,表達的是本類與Department的多對一的關係-->  
        <many-to-one name="department" class="Department" column="departmentId"></many-to-one>  
    </class>  


</hibernate-mapping>  

也可以單向關聯,可以讓一對多的一方放棄維護關聯關係,在 set 標籤中添加屬性 inverse=”true”,inverse 默認爲 false,爲 true 時表示由對方維護關聯關係,本方不維護。可以減少 sql 語句。

在保存的時候,被依賴的在前邊保存,不被依賴的在後邊保存

1.  // 保存  
2.  session.save(department);  
3.  session.save(employee1);  
4.  session.save(employee2);  

department 保存後,保存 employee 時就直接保存了外鍵的值,當先保存 employee 是,不知道外鍵的值,多以保存完 depatment 後,再保存外鍵的值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章