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>数据库进行操作后,更改原来的表

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

猜你喜欢

转载自www.cnblogs.com/yanqingguo/p/9752180.html