Hibernate关联关系映射[通俗易懂]

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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115516.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【Java基础教程】Java的输入输出「建议收藏」

    【Java基础教程】Java的输入输出「建议收藏」持续更新Java基础教程,和hacker一起卷起来

    2022年5月26日
  • 面向过程

    面向过程现在前端技术不是几年前的前端那样,熟练掌握JavaScript、Jquery、Ajax、DOM操作、其他框架等等这些就够了。而随着业务的复杂等多种因素,如今前端有了面向对象的方式编程,如:TypeSc

    2022年8月2日
  • Squid代理服务器(一)——大家所用的游戏代理软件到底为何物?

    Squid代理服务器(一)——大家所用的游戏代理软件到底为何物?一、代理服务器应用场景分析想当年大学时候宿舍控制网速,苦了我们这帮魔兽党,一到晚上工会活动我们就得和全校上万名学生抢网速,作为坦克的我总是因为网速问题导致团灭,咱也是有自尊的人,一怒之下花300元办

    2022年8月5日
  • 银河麒麟v10 centos_银河麒麟创建root用户

    银河麒麟v10 centos_银河麒麟创建root用户由于现在很多软件安装时都需要安装一系列的依赖,出于安全考虑服务器又不一定都能够连接外网。故需要本地配置yum源,当前也可以配置外网yum源(前提是要能够访问外网)

    2022年8月12日
  • ros安装教程 ubuntu18.04_idea安装和配置教程

    ros安装教程 ubuntu18.04_idea安装和配置教程ROS是机器人操作系统(RobotOperatingSystem)的英文缩写,源自斯坦福的开源项目。Ubuntu16.04只能安装ROSLunarLoggerhead或ROSKineticKame依次完成以下四步.第四步提示是否不验证,需输入y,等待安装完成sudosh-c’echo”debhttp://packages.ros.org/ros/ubuntu$(lsb_release-sc)main”>/etc/apt/sources.list.d/r

    2022年9月10日
  • mysql锁表原因及如何处理_表被锁了还能查询

    mysql锁表原因及如何处理_表被锁了还能查询1、锁表发生在insert update、delete中  2、锁表的原理是数据库使用独占式封锁机制,当执行上面的语句时,对表进行锁住,直到发生commite或者回滚或者退出数据库用户 3、锁表的原因  第一、A程序执行了对tableA的insert,并还未commite时,B程序也对tableA进行insert则此时会发生资源正忙的异常就是锁表 第二、锁表常…

    2022年8月23日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号