hibernate_03_hibernate一对多的关系映射

1.实体类的一对多的关系映射

一个客户对应多个联系人

Customer.java

public class Customer {
    private Long cust_id;
    private String cust_name;
    private String cust_source;
    private String cust_industry;
    private String cust_level;
    private String cust_phone;
    private String cust_mobile;
    // 通过ORM方式表示:一个客户对应多个联系人。
    // 放置的多的一方的集合。Hibernate默认使用的是Set集合。
    private Set<LinkMan> linkMans = new HashSet<LinkMan>();   
}

 LinkMan.java

public class LinkMan {
    private Long lkm_id;
    private String lkm_name;
    private String lkm_gender;
    private String lkm_phone;
    private String lkm_mobile;
    private String lkm_email;
    private String lkm_qq;
    private String lkm_position;
    private String lkm_memo;
    // 通过ORM方式表示:一个联系人只能属于某一个客户。
    // 放置的是一的一方的对象。
    private Customer customer;
}

 2.映射文件的一对多的关系映射

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>
    <class name="com.work.entity.Customer" table="cst_customer">
        <!-- 建立OID与主键映射 -->
        <id name="cust_id" column="cust_id">
            <generator class="native"/>
        </id>
        <!-- 建立普通属性与数据库表字段映射 -->
        <property name="cust_name" column="cust_name" />
        <property name="cust_source" column="cust_source"/>
        <property name="cust_industry" column="cust_industry"/>
        <property name="cust_level" column="cust_level"/>
        <property name="cust_phone" column="cust_phone"/>
        <property name="cust_mobile" column="cust_mobile"/>
        <!-- 配置一对多的映射:放置的多的一方的集合 -->
        <!-- 
            set标签 :
                * name    :多的一方的对象集合的属性名称。
                * cascade:级联
                * inverse:放弃外键维护权。inverse="true"
        -->
        <set name="linkMans" cascade="save-update,delete">
            <!--
                 key标签
                    * column:多的一方的外键的名称。
             -->
            <key column="lkm_cust_id"/>
            <!-- 
                one-to-many标签
                    * class    :多的一方的类的全路径
             -->
            <one-to-many class="com.work.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>
    <class name="com.work.entity.LinkMan" table="cst_linkman">
        <!-- 建立OID与主键映射 -->
        <id name="lkm_id" column="lkm_id">
            <generator class="native"/>
        </id>
        <!-- 建立普通属性与表字段映射 -->
        <property name="lkm_name"/>
        <property name="lkm_gender"/>
        <property name="lkm_phone"/>
        <property name="lkm_mobile"/>
        <property name="lkm_email"/>
        <property name="lkm_qq"/>
        <property name="lkm_position"/>
        <property name="lkm_memo"/>
        <!-- 配置多对一的关系:放置的是一的一方的对象 -->
        <!-- 
            many-to-one标签
                * name        :一的一方的对象的属性名称。
                * class        :一的一方的类的全路径。
                * column    :在多的一方的表的外键的名称。
         -->
        <many-to-one name="customer" cascade="save-update,delete" class="com.work.entity.Customer" column="lkm_cust_id"/>
    </class>
</hibernate-mapping>

 3.一对多的操作

1>保存一个客户,和客户下的两个联系人

@Test
    public void saveOrUupdate() {

        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();

        Customer customer = new Customer();
        customer.setCust_name("xj");

        LinkMan linkMan1 = new LinkMan();
        linkMan1.setLkm_name("hdh");

        LinkMan linkMan2 = new LinkMan();
        linkMan1.setLkm_name("hdh");

        customer.getLinkMans().add(linkMan1);
        customer.getLinkMans().add(linkMan2);

        session.save(customer);
        session.save(linkMan1);
        session.save(linkMan2);

        tx.commit();

    }

2>通过级联进行保存一个客户,和客户下的两个联系人

级联操作: 级联指的是,操作一个对象的时候,会同时操作其关联的对象。

级联操作需要对进行操作的一方进行配置:cascade="save-update,delete"

<set name="linkMans" cascade="save-update,delete" inverse="true">
            <!--
                 key标签
                    * column:多的一方的外键的名称。
             -->
            <key column="lkm_cust_id"/>
            <!-- 
                one-to-many标签
                    * class    :多的一方的类的全路径
             -->
            <one-to-many class="com.work.entity.LinkMan"/>
        </set>

 通过级联操作只需要对一方进行更新

保存级联操作:保存客户客户对应的联系人也保存了

@Test
    public void saveOrUupdate2() {

        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();

        Customer customer = new Customer();
        customer.setCust_name("lq");

        LinkMan linkMan1 = new LinkMan();
        linkMan1.setLkm_name("hdh");

        LinkMan linkMan2 = new LinkMan();
        linkMan2.setLkm_name("xj");

        customer.getLinkMans().add(linkMan1);
        customer.getLinkMans().add(linkMan2);

        //进行了级联操作 只需要更新一方
        session.save(customer);

        tx.commit();
    }

 删除级联操作:删除客户客户对应的联系人也删除了

 @Test
    public void delete() {

        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();

        Customer customer = session.get(Customer.class, 2L);
        session.delete(customer);

        tx.commit();

    }

 更新级联操作

@Test
    public void update() {

        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();

        //进行级联更新
        Customer customer = session.get(Customer.class, 3L);
        LinkMan linkMan = session.get(LinkMan.class, 5l);

        //关联
        customer.getLinkMans().add(linkMan);
        linkMan.setCustomer(customer);
session.update(customer); tx.commit(); }

 4.cascadeinverse的区别

cascade:是控制关联的对象

inverse:是控制 一的一方是否有放弃外键的维护权

 

 

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/asndxj/p/12061306.html