hibernate一对多关系操作

简介: hibernate一对多关系操作

以客户和联系人为例:客户是一,联系人是多

第一步 创建两个实体类,客户和联系人

第二步 让两个实体类之间互相表示

(1)在客户实体类里面表示多个联系人一个客户里面有多个联系人

20180406202523146 (1).png

2)在联系人实体类里面表示所属客户-,一个联系人只能属于一个客户

20180406202630228 (1).png

第三步 配置映射关系

(1)一般一个实体类对应一个映射文件

(2)把映射最基本配置完成

(3)在映射文件中,配置一对多关系- 在客户映射文件中,表示所有联系人

客户的实体类配置:Customer.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <!-- 1 配置类和表对应 
    class标签
    name属性:实体类全路径
    table属性:数据库表名称
  -->
  <class name="cn.itcast.entity.Customer" table="t_customer">
    <id name="cid" column="cid">
      <generator class="native"></generator>
    </id>
    <property name="custName" column="custName"></property>
    <property name="custLevel" column="custLevel"></property>
    <property name="custSource" column="custSource"></property>
    <property name="custPhone" column="custPhone"></property>
    <property name="custMobile" column="custMobile"></property>
    <!-- 在客户映射文件中,表示所有联系人 
      使用set标签表示所有联系人
      set标签里面有name属性:
           属性值写在客户实体类里面表示联系人的set集合名称
       inverse属性默认值:false不放弃关系维护
                      true表示放弃关系维护
    -->
    <set name="setLinkMan" cascade="save-update">
      <!-- 一对多建表,有外键
        hibernate机制:双向维护外键,在一和多那一方都配置外键 
        column属性值:外键名称
       -->
      <key column="clid"></key>
      <!-- 客户所有的联系人,class里面写联系人实体类全路径 -->
      <one-to-many class="cn.itcast.entity.LinkMan"/>
    </set>
  </class>
</hibernate-mapping>

联系人的实体类配置:LinkMan.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <!-- 1 配置类和表对应 
    class标签
    name属性:实体类全路径
    table属性:数据库表名称
  -->
  <class name="cn.itcast.entity.LinkMan" table="t_linkman">
    <id name="lkm_id" column="lkm_id">
      <generator class="native"></generator>
    </id>
    <property name="lkm_name" column="lkm_name"></property>
    <property name="lkm_gender" column="lkm_gender"></property>
    <property name="lkm_phone" column="lkm_phone"></property>
    <!-- 表示联系人所属客户 
      name属性:因为在联系人实体类使用customer对象表示,写customer名称
      class属性:customer全路径
      column属性:外键名称
    -->
    <many-to-one name="customer" class="cn.itcast.entity.Customer" column="clid"></many-to-one>
  </class>
</hibernate-mapping>

第四步 创建核心配置文件,把映射文件引入到核心配置文件中(hibernate.cfg.xml)

20180406203338495 (1).png

一对多级联保存:

  //演示一对多级联保存
  @Test
  public void testAddDemo1() {
    SessionFactory sessionFactory = null;
    Session session = null;
    Transaction tx = null;
    try {
      //得到sessionFactory
      sessionFactory = HibernateUtils.getSessionFactory();
      //得到session
      session = sessionFactory.openSession();
      //开启事务
      tx = session.beginTransaction();
      // 添加一个客户,为这个客户添加一个联系人
      //1 创建客户和联系人对象
      Customer customer = new Customer();
      customer.setCustName("传智播客");
      customer.setCustLevel("vip");
      customer.setCustSource("网络");
      customer.setCustPhone("110");
      customer.setCustMobile("999");
      LinkMan linkman = new LinkMan();
      linkman.setLkm_name("lucy");
      linkman.setLkm_gender("男");
      linkman.setLkm_phone("911");
      //2 在客户表示所有联系人,在联系人表示客户   
      // 建立客户对象和联系人对象关系
      //2.1 把联系人对象 放到客户对象的set集合里面
      customer.getSetLinkMan().add(linkman);
      //2.2 把客户对象放到联系人里面
      linkman.setCustomer(customer);
      //3 保存到数据库
      session.save(customer);
      session.save(linkman);
      //提交事务
      tx.commit();
    }catch(Exception e) {
      tx.rollback();
    }finally {
      session.close();
      //sessionFactory不需要关闭
      sessionFactory.close();
    }
  }

一对多级联删除:

1 删除某个客户,把客户里面所有的联系人删除

2 具体实现

第一步 在客户映射文件set标签,进行配置

2018040620403321 (1).png

(1)使用属性cascade属性值 delete

第二步 在代码中直接删除客户

(1)根据id查询对象,调用session里面delete方法删除

20180406204101679 (1).png

3 执行过程:

(1)根据id查询客户

(2)根据外键id值查询联系人

(3)把联系人外键设置为null

(4)删除联系人和客户

一对多的修改(inverse属性)

把一的那一方放弃放弃关系维护20180406205030803 (1).png

  //演示一对多修改
  @Test
  public void testUpdate() {
    SessionFactory sessionFactory = null;
    Session session = null;
    Transaction tx = null;
    try {
      //得到sessionFactory
      sessionFactory = HibernateUtils.getSessionFactory();
      //得到session
      session = sessionFactory.openSession();
      //开启事务
      tx = session.beginTransaction();
      //1 根据id查询lucy联系人,根据id查询百度的客户
      Customer baidu = session.get(Customer.class, 2);
      LinkMan lucy = session.get(LinkMan.class, 2);
      //2 设置持久态对象值
      //把联系人放到客户里面
      baidu.getSetLinkMan().add(lucy);
      //把客户放到联系人里面
      lucy.setCustomer(baidu);
      //提交事务
      tx.commit();
    }catch(Exception e) {
      tx.rollback();
    }finally {
      session.close();
      //sessionFactory不需要关闭
      sessionFactory.close();
    }
  }
相关文章
|
9月前
|
SQL XML Java
Hibernate框架【四】——基本映射——多对一和一对多映射
Hibernate框架【四】——基本映射——多对一和一对多映射
105 0
|
XML Java 数据库连接
《Hibernate上课笔记》------class6------Hibernate实现一对多关联映射
《Hibernate上课笔记》------class6------Hibernate实现一对多关联映射
45 0
《Hibernate上课笔记》------class6------Hibernate实现一对多关联映射
|
XML Java 关系型数据库
hibernate里面的一对多关系映射
hibernate里面的一对多关系映射
85 0
|
存储 Java 数据库连接
【框架】[Hibernate]利用Hibernate进行一对多的级联操作-Web实例
【框架】[Hibernate]利用Hibernate进行一对多的级联操作-Web实例
152 0
【框架】[Hibernate]利用Hibernate进行一对多的级联操作-Web实例
|
Java 数据库连接 网络安全
【SSH快速进阶】——Hibernate 多对一映射 和 一对多映射
上两篇文章说了一对一映射,这里说一下多对一 和 一对多的映射情况。
【SSH快速进阶】——Hibernate 多对一映射 和 一对多映射
|
缓存 Java 数据库连接
Hibernate一对多关联的两个关键属性cascade和inverse(十一)
Hibernate一对多关联的两个关键属性cascade和inverse(十一)
Hibernate一对多关联的两个关键属性cascade和inverse(十一)
|
存储 Java 数据库连接
Hibernate的一对多映射的单向关联和双向关联(九)
Hibernate的一对多映射的单向关联和双向关联(九)
116 0
Hibernate的一对多映射的单向关联和双向关联(九)
|
缓存 NoSQL Java
hibernate(三) 一对多映射关系
前面两节讲了hibernate的两个配置文件和hello world!。还有hibernate的一级缓存和三种状态,基本上hibernate就懂一点了,从这章起开始一个很重要的知识点,hibernate的关系映射。一对一、一对多、多对多的讲解。,希望你们能从中学到东西,我也从中巩固自己的知识
133 0