1.  Hibernate关联关系映射

1.1.  one to one

<class name="Person">
    <id name="id" column="personId">
        <generator class="native"/>
    </id>
    <join table="PersonAddress" 
        optional="true">
        <key column="personId" 
            unique="true"/>
        <many-to-one name="address"
            column="addressId" 
            not-null="true"
            unique="true"/>
    </join>
</class>
 
<class name="Address">
    <id name="id" column="addressId">
        <generator class="native"/>
    </id>
</class>

1.2.  one to many

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.morris.hql.entity.Department" table="DEPARTMENT" schema="SCOTT">
        <id name="deptid" type="java.lang.String">
            <column name="DEPTID" length="20" />
            <generator class="assigned" />
        </id>
        <property name="deptname" type="java.lang.String">
            <column name="DEPTNAME" length="20" not-null="true" />
        </property>
        <set name="employees" inverse="true">
            <key>
                <column name="DEPTID" length="20" />
            </key>
            <one-to-many class="com.morris.hql.entity.Employee" />
        </set>
    </class>
</hibernate-mapping>

1.3.  many to one

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.morris.hql.entity.Employee" table="EMPLOYEE" schema="SCOTT">
        <id name="empid" type="java.lang.String">
            <column name="EMPID" length="20" />
            <generator class="assigned" />
        </id>
        <many-to-one name="department" class="com.morris.hql.entity.Department" fetch="select">
            <column name="DEPTID" length="20" />
        </many-to-one>
        <property name="empname" type="java.lang.String">
            <column name="EMPNAME" length="20" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

1.4.  many to many

<class name="Person">
    <id name="id" column="personId">
        <generator class="native"/>
    </id>
    <set name="addresses" table="PersonAddress">
        <key column="personId"/>
        <many-to-many column="addressId"
            class="Address"/>
    </set>
</class>
 
<class name="Address">
    <id name="id" column="addressId">
        <generator class="native"/>
    </id>
</class>

1.5.  实例

1.5.1.  级联增加

public  void addDeptEmp(Department dept, Employee emp) {
 
       Session session = HibernateSessionFactory.getSession();
       Transaction transaction = null;
 
       try {
           transaction = session.beginTransaction();
 
           dept.getEmployees().add(emp);
           emp.setDepartment(dept);
           
           session.save(dept);
 
           transaction.commit();
 
       } catch (Exception e) {
           if (transaction != null) {
              transaction.rollback();
           }
           e.printStackTrace();
       } finally {
           if (session != null) {
              session.close();
 
           }
       }
 
    }

打印的sql语句

Hibernate: 
select
        employee_.EMPID,
        employee_.DEPTID as DEPTID0_,
        employee_.EMPNAME as EMPNAME0_ 
    from
        SCOTT.EMPLOYEE employee_ 
    where
        employee_.EMPID=?
Hibernate: 
insert 
    into
        SCOTT.DEPARTMENT
        (DEPTNAME, DEPTID) 
    values
        (?, ?)
Hibernate: 
insert 
    into
        SCOTT.EMPLOYEE
        (DEPTID, EMPNAME, EMPID) 
    values
        (?, ?, ?)

1.5.2.  级联删除

public  void deleteDeptEmp(Department dept, Employee emp) {
       Session session = HibernateSessionFactory.getSession();
       Transaction transaction = null;
       try {
           transaction = session.beginTransaction();
session.delete(dept);
           transaction.commit();
       } catch (Exception e) {
           if (transaction != null) {
              transaction.rollback();
           }
           e.printStackTrace();
       } finally {
           if (session != null) {
              session.close();
           }
}
}

打印的sql语句

Hibernate: 
select
        department0_.DEPTID as DEPTID1_1_,
        department0_.DEPTNAME as DEPTNAME1_1_,
        employees1_.DEPTID as DEPTID3_,
        employees1_.EMPID as EMPID3_,
        employees1_.EMPID as EMPID0_0_,
        employees1_.DEPTID as DEPTID0_0_,
        employees1_.EMPNAME as EMPNAME0_0_ 
    from
        SCOTT.DEPARTMENT department0_ 
    left outer join
        SCOTT.EMPLOYEE employees1_ 
            on department0_.DEPTID=employees1_.DEPTID 
    where
        department0_.DEPTID=?
Hibernate: 
delete 
    from
        SCOTT.EMPLOYEE 
    where
        EMPID=?
Hibernate: 
delete 
    from
        SCOTT.DEPARTMENT 
    where
        DEPTID=?

1.5.3.  级联修改

public  void updateDeptEmp() {
       Session session = HibernateSessionFactory.getSession();
       Transaction transaction = null;
 
       try {
           transaction = session.beginTransaction();
           
           Department dept = (Department) session.load(Department.class, "5");
 
           Employee emp = (Employee) session.load(Employee.class, "1001");
 
"就业部");
"a");
           
           session.update(dept);
           session.update(emp);
 
 
           transaction.commit();
 
       } catch (Exception e) {
           if (transaction != null) {
              transaction.rollback();
           }
           e.printStackTrace();
       } finally {
           if (session != null) {
              session.close();
           }
       }
 
    }

打印的sql语句

Hibernate: 
    select
        department0_.DEPTID as DEPTID1_1_,
        department0_.DEPTNAME as DEPTNAME1_1_,
        employees1_.DEPTID as DEPTID3_,
        employees1_.EMPID as EMPID3_,
        employees1_.EMPID as EMPID0_0_,
        employees1_.DEPTID as DEPTID0_0_,
        employees1_.EMPNAME as EMPNAME0_0_ 
    from
        SCOTT.DEPARTMENT department0_ 
    left outer join
        SCOTT.EMPLOYEE employees1_ 
            on department0_.DEPTID=employees1_.DEPTID 
    where
        department0_.DEPTID=?
Hibernate: 
    select
        employee0_.EMPID as EMPID0_0_,
        employee0_.DEPTID as DEPTID0_0_,
        employee0_.EMPNAME as EMPNAME0_0_ 
    from
        SCOTT.EMPLOYEE employee0_ 
    where
        employee0_.EMPID=?
Hibernate: 
update
        SCOTT.DEPARTMENT 
    set
        DEPTNAME=? 
    where
        DEPTID=?
Hibernate: 
update
        SCOTT.EMPLOYEE 
    set
        DEPTID=?,
        EMPNAME=? 
    where
        EMPID=?

1.5.4.  级联查询

public Employee queryEmployeeById(String id){
       Session session = HibernateSessionFactory.getSession();
       Employee employee = null;
       try {
    employee = (Employee) session.load(Employee.class, id);
    System.out.println(employee.getEmpname());
       } finally {
           if (session != null) {
              session.close();
           }
       }
       return employee;
       
    }

打印的sql语句

Hibernate: 
    select
        employee0_.EMPID as EMPID0_0_,
        employee0_.DEPTID as DEPTID0_0_,
        employee0_.EMPNAME as EMPNAME0_0_ 
    from
        SCOTT.EMPLOYEE employee0_ 
    where
        employee0_.EMPID=?
Hibernate: 
    select
        department0_.DEPTID as DEPTID1_0_,
        department0_.DEPTNAME as DEPTNAME1_0_ 
    from
        SCOTT.DEPARTMENT department0_ 
    where
        department0_.DEPTID=?
a