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

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • android开发案例「建议收藏」

    android开发案例「建议收藏」20多个可以提高你安卓开发技能的开源app学习的最佳方式就是阅读,对程序员来说也是如此。如果你想成为一个更优秀的程序员,你必须阅读更多的代码,就是这么简单。书籍,博客,论坛在某种程度上都是有益的,但是没有什么能替代功能完善、代码详细的开源项目。整个app的所有相关资源都直接呈现在你面前。AndroidTheme.AppCompat中,你应该熟悉的颜色属性创建一个Android工程

  • c++多态的案例分析

    c++多态的案例分析

    2021年12月15日
  • mysql自定义函数详解_数据库自定义函数

    mysql自定义函数详解_数据库自定义函数1.创建自定义函数DELIMITER$$DROPFUNCTIONIFEXISTSgenPerson$$CREATEFUNCTIONgenPerson(namevarchar(20))RETURNSvarchar(50)BEGINDECLAREstrVARCHAR(50)DEFAULT”;SET@tableName=name;SETst…

  • kubernetes清除状态为Evicted的pod

    kubernetes清除状态为Evicted的podkubectlgetpods|grepEvicted|awk'{print$1}’|xargskubectldeletepod  清除脚本#!/bin/bashforpodin$(kubectlgetpods|grepEvicted|awk'{print$1}’);dokubectldeletep…

  • MySQL中group_concat函数用法总结

    MySQL中group_concat函数用法总结MySQL中group_concat函数用法总结一、group_concat函数的功能将groupby产生的同一个分组中的值连接起来,返回一个字符串结果。group_concat函数首先根据groupby指定的列进行分组,将同一组的列显示出来,并且用分隔符分隔。由函数参数(字段名)决定要返回的列。例如:createtableemp(emp_idintprimaryke…

  • 比例和比率的区别

    比例和比率的区别数据分析中可能会出现比例和比率的区别:举个例子:全班人数50人,男生30,女生20,那男生的比例就是30/50,同理女生的就是20/50,那么男女的比率是什么呢,是30/20对,就是这个区别。…

发表回复

您的电子邮箱地址不会被公开。

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