1. 程式人生 > >Hibernate一對多配置示例

Hibernate一對多配置示例

客戶(一)與聯絡人(多)示例

可以通過多個聯絡人聯絡到你的客戶

表結構

customer表

CREATE TABLE `cst_customer`(
`cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客戶編號(主鍵)',
  `cust_name` varchar(32) NOT NULL COMMENT '客戶名稱(公司名稱)',
  `cust_source` varchar(32) DEFAULT NULL COMMENT '客戶資訊來源',
  `cust_industry` varchar(32) DEFAULT NULL COMMENT '客戶所屬行業',
  `cust_level` varchar(32) DEFAULT NULL COMMENT '客戶級別',
  `cust_phone` varchar(64) DEFAULT NULL COMMENT '固定電話',
  `cust_mobile` varchar(16) DEFAULT NULL COMMENT '行動電話',
  PRIMARY KEY (`cust_id`)
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

linkman表

CREATE TABLE `cst_linkman` (
  `lkm_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '聯絡人編號(主鍵)',
  `lkm_name` varchar(16) DEFAULT NULL COMMENT '聯絡人姓名',
  `lkm_cust_id` bigint(32) DEFAULT NULL COMMENT '客戶id',
  `lkm_gender` char(1) DEFAULT NULL COMMENT '聯絡人性別',
  `lkm_phone` varchar(16) DEFAULT NULL COMMENT '聯絡人辦公電話',
  `lkm_mobile` varchar(16) DEFAULT NULL COMMENT '聯絡人手機',
  `lkm_email` varchar(64) DEFAULT NULL COMMENT '聯絡人郵箱',
  `lkm_qq` varchar(16) DEFAULT NULL COMMENT '聯絡人qq',
  `lkm_position` varchar(16) DEFAULT NULL COMMENT '聯絡人職位',
  `lkm_memo` varchar(512) DEFAULT NULL COMMENT '聯絡人備註',
  PRIMARY KEY (`lkm_id`),
  KEY `FK_cst_linkman_lkm_cust_id` (`lkm_cust_id`),
  CONSTRAINT `FK_cst_linkman_lkm_cust_id` FOREIGN KEY (`lkm_cust_id`) REFERENCES `cst_customer` (`cust_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

類程式碼

Cusotmer類

package com.itykd.domain;

import java.util.HashSet;
import java.util.Set;

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;
    private Set<LinkMan> linkMans = new HashSet<>();
	public Customer() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Long getCust_id() {
		return cust_id;
	}
	public void setCust_id(Long 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;
	}
	public Set<LinkMan> getLinkMans() {
		return linkMans;
	}
	public void setLinkMans(Set<LinkMan> linkMans) {
		this.linkMans = linkMans;
	}
    
}

LinkMan類

package com.itykd.domain;

public class LinkMan {
	private Long lkm_id;
	private String lkm_name;
	private Long lkm_cust_id;
	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;
	public LinkMan() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Long getLkm_id() {
		return lkm_id;
	}
	public void setLkm_id(Long 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 Long getLkm_cust_id() {
		return lkm_cust_id;
	}
	public void setLkm_cust_id(Long lkm_cust_id) {
		this.lkm_cust_id = lkm_cust_id;
	}
	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;
	}
	public Customer getCustomer() {
		return customer;
	}
	public void setCustomer(Customer customer) {
		this.customer = customer;
	}
    
}

一對多的時候,作為一的一方(Customer)要建立多的一方(LinkMan)的一個集合屬性,而多的一方(LinkMan)要建立一的一方(Customer)的一個唯一屬性; 

Mapper.hbm.xml

Customer.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-11-20 16:04:05 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
     <!--將實體的資料與表的資料相關連,即orm的一個聯絡 -->
    <class name="com.itykd.domain.Customer" table="cst_customer">
    	<id name="cust_id" column="cust_id">
    		<!-- 主鍵生成策略-->
    		<generator class="native"/>
    	</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="linkMans" cascade="save-update">
    	    <key>
    	        <column name="lkm_cust_id"/>
    	    </key>
    	    <one-to-many class="com.itykd.domain.LinkMan" />
    	</set>   
    </class>
</hibernate-mapping>

LinkMan.hbm.xml

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-11-21 11:05:53 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="com.itykd.domain.LinkMan" table="LINKMAN">
        <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="customer" class="com.itykd.domain.Customer" column="lkm_cust_id"/>
    </class>
</hibernate-mapping>

示例程式碼

package com.itykd.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
	public static final Configuration HIBERNATE_CONFIGURATION;
	public static final SessionFactory SESSION_FACTORY;
    static {
    	HIBERNATE_CONFIGURATION = new Configuration().configure();
    	SESSION_FACTORY = HIBERNATE_CONFIGURATION.buildSessionFactory();
    }
	public static Session openSession() {
    	return SESSION_FACTORY.openSession();
    }
	
	public static Session getCurrentSession() {
    	return SESSION_FACTORY.getCurrentSession();
    }
}
 package com.itykd.demo;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.itykd.domain.Customer;
import com.itykd.domain.LinkMan;
import com.itykd.domain.Role;
import com.itykd.domain.User;
import com.itykd.util.HibernateUtils;

public class HibernateDemo {
    @Test
public void cascadeAddOperationByCusotmer() {
    	Session session = HibernateUtils.getCurrentSession();
    	Transaction tx = session.beginTransaction();
    	Customer customer1 = new Customer();
    	customer1.setCust_name("wade");
        LinkMan linkMan1 = new LinkMan();
        linkMan1.setLkm_name("anta");
        LinkMan linkMan2 = new LinkMan();
        linkMan2.setLkm_name("tebu");
    	customer1.getLinkMans().add(linkMan1);
    	customer1.getLinkMans().add(linkMan2);
    	session.save(customer1);
    	tx.commit();	
    }
}