Hibernate关联关系映射

Posted yxwkaifa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate关联关系映射相关的知识,希望对你有一定的参考价值。

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");

 

           dept.setDeptname("就业部");

           emp.setEmpname("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

 

以上是关于Hibernate关联关系映射的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate关联映射关系

Hibernate关联关系映射

Hibernate关联映射

Hibernate关联关系映射之一对一关联关系

第六章 Hibernate关联映射

hibernate关联关系映射