zoukankan      html  css  js  c++  java
  • hibernate配置一对多ORM映射关系

    一对多,一个客户Customer对应多个联系人LinkMan

    1.创建表

    CREATE TABLE `cst_customer` (
      `cust_id` int(11) NOT NULL AUTO_INCREMENT,
      `cust_name` varchar(255) DEFAULT NULL,
      `cust_source` varchar(255) DEFAULT NULL,
      `cust_industry` varchar(255) DEFAULT NULL,
      `cust_level` varchar(255) DEFAULT NULL,
      `cust_phone` varchar(255) DEFAULT NULL,
      `cust_mobile` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`cust_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
    
    
    CREATE TABLE `cst_linkman` (
      `lkm_id` int(11) NOT NULL AUTO_INCREMENT,
      `lkm_name` varchar(255) DEFAULT NULL,
      `lkm_gender` varchar(255) DEFAULT NULL,
      `lkm_phone` varchar(255) DEFAULT NULL,
      `lkm_mobile` varchar(255) DEFAULT NULL,
      `lkm_email` varchar(255) DEFAULT NULL,
      `lkm_qq` varchar(255) DEFAULT NULL,
      `lkm_position` varchar(255) DEFAULT NULL,
      `lkm_memo` varchar(255) DEFAULT NULL,
      `lkm_cust_id` int(11) DEFAULT NULL,
      PRIMARY KEY (`lkm_id`),
      KEY `FK178F1FE55090E597` (`lkm_cust_id`),
      CONSTRAINT `FK178F1FE55090E597` FOREIGN KEY (`lkm_cust_id`) REFERENCES `cst_customer` (`cust_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

    2.创建和数据对应的实体类


    在一的一方,需要配置一个集合装载多方对象,一般用Set,
    比如Customer类中配置private Set<LinkMan> link_man = new HashSet<>();

    import java.util.HashSet; import java.util.Set; public class Customer { private Integer 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; private Set<LinkMan> link_man = new HashSet<>(); @Override public String toString() { return "Customer [cust_id=" + cust_id + ", cust_name=" + cust_name + ", cust_source=" + cust_source + ", cust_industry=" + cust_industry + ", cust_level=" + cust_level + ", cust_phone=" + cust_phone + ", cust_mobile=" + cust_mobile + ", link_man=" + link_man + "]"; } public Set<LinkMan> getLink_man() { return link_man; } public void setLink_man(Set<LinkMan> link_man) { this.link_man = link_man; } public Integer getCust_id() { return cust_id; } public void setCust_id(Integer cust_id) { this.cust_id = cust_id; } public String getCust_name() { return cust_name; } public void setCust_name(String cust_name) { this.cust_name = cust_name; } public String getCust_source() { return cust_source; } public void setCust_source(String cust_source) { this.cust_source = cust_source; } public String getCust_industry() { return cust_industry; } public void setCust_industry(String cust_industry) { this.cust_industry = cust_industry; } public String getCust_level() { return cust_level; } public void setCust_level(String cust_level) { this.cust_level = cust_level; } public String getCust_phone() { return cust_phone; } public void setCust_phone(String cust_phone) { this.cust_phone = cust_phone; } public String getCust_mobile() { return cust_mobile; } public void setCust_mobile(String cust_mobile) { this.cust_mobile = cust_mobile; } }
    多的一方需要配置一方的对象,比如private Customer customer。

    public class LinkMan { private Integer 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; private Customer customer; @Override public String toString() { return "LinkMan [lkm_id=" + lkm_id + ", lkm_name=" + lkm_name + ", lkm_gender=" + lkm_gender + ", lkm_phone=" + lkm_phone + ", lkm_mobile=" + lkm_mobile + ", lkm_email=" + lkm_email + ", lkm_qq=" + lkm_qq + ", lkm_position=" + lkm_position + ", lkm_memo=" + lkm_memo + "]"; } public Customer getCustomer() { return customer; } public void setCustomer(Customer customer) { this.customer = customer; } public Integer getLkm_id() { return lkm_id; } public void setLkm_id(Integer lkm_id) { this.lkm_id = lkm_id; } public String getLkm_name() { return lkm_name; } public void setLkm_name(String lkm_name) { this.lkm_name = lkm_name; } public String getLkm_gender() { return lkm_gender; } public void setLkm_gender(String lkm_gender) { this.lkm_gender = lkm_gender; } public String getLkm_phone() { return lkm_phone; } public void setLkm_phone(String lkm_phone) { this.lkm_phone = lkm_phone; } public String getLkm_mobile() { return lkm_mobile; } public void setLkm_mobile(String lkm_mobile) { this.lkm_mobile = lkm_mobile; } public String getLkm_email() { return lkm_email; } public void setLkm_email(String lkm_email) { this.lkm_email = lkm_email; } public String getLkm_qq() { return lkm_qq; } public void setLkm_qq(String lkm_qq) { this.lkm_qq = lkm_qq; } public String getLkm_position() { return lkm_position; } public void setLkm_position(String lkm_position) { this.lkm_position = lkm_position; } public String getLkm_memo() { return lkm_memo; } public void setLkm_memo(String lkm_memo) { this.lkm_memo = lkm_memo; } }

    3.配置实体类对应的配置文件,最重要的是一对多和多对一的配置,cascade设置级联操作,可以是save-update、delete、all

    <?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 package="com.yqg.hibernate.entity">
           <class name="Customer" table="cst_customer">
           <id name="cust_id" column="cust_id">
           <generator class="native"></generator>
           </id>
           <property name="cust_name" column="cust_name"></property>
           <property name="cust_source" column="cust_source"></property>
           <property name="cust_industry" column="cust_industry"></property>
           <property name="cust_level" column="cust_level"></property>
           <property name="cust_phone" column="cust_phone"></property>
           <property name="cust_mobile" column="cust_mobile"></property>
           <!-- 配置一对多关系 -->
           <set name="link_man" cascade="save-update">
              <key column="lkm_cust_id"></key>
              <one-to-many class="LinkMan"/>
           </set>
           </class>
        </hibernate-mapping>
    <?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 package="com.yqg.hibernate.entity">
        <class name="LinkMan" table="cst_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>
        <property name="lkm_mobile" column="lkm_mobile"></property>
        <property name="lkm_email" column="lkm_email"></property>
        <property name="lkm_qq" column="lkm_qq"></property>
        <property name="lkm_position" column="lkm_position"></property>
        <property name="lkm_memo" column="lkm_memo"></property>
        <!-- 配置多对一的关系 -->
        <many-to-one name="customer" cascade="save-update,delete" class="Customer" column="lkm_cust_id"></many-to-one>
        </class>
        </hibernate-mapping>

    4.编写测试类进行测试

    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import com.yqg.hibernate.entity.Customer;
    import com.yqg.hibernate.entity.LinkMan;
    import com.yqg.hibernate.utils.hibernateUtils;
    
    public class Demo3 {
        @Test
           //对象导航,双方都要设置级联关系
          public void demo3(){
               Session session=hibernateUtils.getCurrentSession();
                Transaction transaction=session.beginTransaction();
                
                Customer customer=new Customer();
                customer.setCust_name("000");
                
                LinkMan linkman=new LinkMan();
                linkman.setLkm_name("111");
                LinkMan linkman1=new LinkMan();
                linkman1.setLkm_name("222");
                LinkMan linkman2=new LinkMan();
                linkman2.setLkm_name("333");
                
                linkman.setCustomer(customer);
                customer.getLink_man().add(linkman1);
                customer.getLink_man().add(linkman2);
                
                session.save(linkman);//发送四条插入语句
    //            session.save(customer);//发送两条语句
    //            session.save(linkman2);//发送一句语句
                transaction.commit();
           }
    }
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    
    public class hibernateUtils {
            public static final Configuration cfg;
            public static final SessionFactory sf;
            
            static {
                cfg=new Configuration().configure();
                sf=cfg.buildSessionFactory();
            }
            public static Session openSession() {
                return sf.openSession();
            }
            public static Session getCurrentSession(){
                return sf.getCurrentSession();
            }
    }

    上面测试了hibernate的对象导航,因为在两者配置文件中设置了cascade=“save-update”,所以可以进行级联保存操作。下面是级联删除操作

    import org.hibernate.Session;
    import org.hibernate.Transaction;
    /*级联删除
     * */
    import org.junit.Test;
    
    import com.yqg.hibernate.entity.Customer;
    import com.yqg.hibernate.entity.LinkMan;
    import com.yqg.hibernate.utils.hibernateUtils;
    
    public class Demo5 {
          @Test
          public void demo() {
              Session session=hibernateUtils.getCurrentSession();
              Transaction transaction=session.beginTransaction();
              //如果没有设置级联删除,删除客户那么联系人对应的客户id就为null
              //设置级联删除,删除customer,级联删除联系人,一般都是删除一方级联删除多方
              //<set name="link_man" cascade="save-update,delete">
              Customer customer=(Customer) session.get(Customer.class, 1);
              System.out.println(customer.toString());
              session.delete(customer);
              //删除多的一方,同时删除一方,基本不用
    //          LinkMan linkman=(LinkMan) session.get(LinkMan.class, 6);
    //          session.delete(linkman);
              transaction.commit();
          }
    }

    5.其他注意点

    <!-- 数据库表设置 -->
              <property name="hibernate.hbm2ddl.auto">create</property>数据库进行操作后创建一个新表
             <property name="hibernate.hbm2ddl.auto">update</property>数据库进行操作后,更改原来的表

     不要忘记在核心配置文件配置资源文件

  • 相关阅读:
    【python】学习笔记10-ddt数据驱动
    【python】学习笔记10-装饰器
    【Python】学习笔记8-多线程多进程
    【Python】学习笔记7-异常处理try。。except .. as e ....else
    【Python】学习笔记6-补充Flask模块:登录接口,mysql数据库、存redis-sesson、存浏览器cookie
    【Python】学习笔记6-创建Excel:xlwt,读取Excel:xlrd ,修改Excel:xlutils
    【Python】学习笔记6-网络编程urllib,request,请求rul
    【Python】学习笔记5-利用flask来mock接口
    【Python】学习笔记5-操作redis数据库redis
    【Python】学习笔记5-模块pymysql操作mysql数据库
  • 原文地址:https://www.cnblogs.com/yanqingguo/p/9752180.html
Copyright © 2011-2022 走看看