1. 程式人生 > >Hibernate關聯關係

Hibernate關聯關係

                  關聯關係在orm框架中是一個比較重要的一部分,在學習Hibernate框架的朋友可以重點的關注一下。

  關聯關係通俗一點來說就是資料庫表與表之間的關係(主外來鍵關係),hibernare框架弱化了資料庫表的一些操作,強化了實體類的操作,在hibernate中操作實體類就等同於操作資料庫表。

關聯關係分為三種:一對一、一對多、多對多

一對一:<one-to-one name=""></one-to-one>

一對一的關係配置有幾種,這裡我們配比較常用的一種

<!--由於在申明主鍵的時候已經將關係寫清楚了,所以在這裡沒有

column這個屬性。按平常的習慣,我們會在這裡寫上column="資料庫中外來鍵欄位屬性名稱。"-->      <!--constrained屬性:就是表明主鍵當外來鍵使用了。這個屬性兩個作用,一是通知這種對應關係在上面已經寫過了,所以這裡才不需要寫column,二是表明這種關係是主鍵當外來鍵。      其實還有一個級聯關係的作用-->         <one-to-one name="idCard" constrained="true"></one-to-one>  

一對多 :<many-to-one name=""></many-to-one> 資料庫表結構:

--  使用者表
CREATE TABLE tb_testUser(
puid VARCHAR(35) PRIMARY KEY,
tname VARCHAR(20) NOT NULL,
sex int DEFAULT 1 -- 1(男),2(女)
);


-- 使用者文章表
CREATE TABLE tb_article(
aid VARCHAR(35) PRIMARY KEY,
fuid VARCHAR(35) not NULL,
content VARCHAR(300)

);

   1.實體類的部署:

一端實體類

package xyz.askway.pojo;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;


/**xyz.askway.pojo(package)
 *Name:一端實體類
 *Function:持久化(CRUD)
 *WANGLiMiN
 *2018-08-07 11:15:14
 */
public class Y implements Serializable {

	/**
	 * Function:
	 * Analysis:
	 * WANGLiMiN
	 *2018-08-07 11:15:14
	 */
	private static final long serialVersionUID = 1L;

	private String puidl;  
	private String unamel;  
	private Integer sexl; 
	private Set<D> dSetl = new HashSet<D>(); //多端集合
	
	public Y(String puidl, String unamel, Integer sexl, Set<D> dSetl) {
		this.puidl = puidl;
		this.unamel = unamel;
		this.sexl = sexl;
		this.dSetl = dSetl;
	}

	public Y() {
	}

	public String getPuidl() {
		return puidl;
	}

	public void setPuidl(String puidl) {
		this.puidl = puidl;
	}

	public String getUnamel() {
		return unamel;
	}

	public void setUnamel(String unamel) {
		this.unamel = unamel;
	}

	public Integer getSexl() {
		return sexl;
	}

	public void setSexl(Integer sexl) {
		this.sexl = sexl;
	}

	public Set<D> getdSetl() {
		return dSetl;
	}

	public void setdSetl(Set<D> dSetl) {
		this.dSetl = dSetl;
	}

	@Override
	public String toString() {
		return "Y [puidl=" + puidl + ", unamel=" + unamel + ", sexl=" + sexl + ", dSetl=" + dSetl + "]";
	}
	

}

多端實體類

package xyz.askway.pojo;

import java.io.Serializable;

/**xyz.askway.pojo(package)
 *Name:多端實體類
 *Function:
 * @author WANGLiMiN
 */
public class D implements Serializable{
	
	/**Function:
	 * Analysis:
	 * @author WANGLiMiN
	 */
	private static final long serialVersionUID = 1L;
	
	private String aidv ;
	private String contentv;
	private Y y; //一端物件

	public D(String aidv,  String contentv, Y y) {
		this.aidv = aidv;
		this.contentv = contentv;
		this.y = y;
	}

	public D() {
	
	}

	public String getAidv() {
		return aidv;
	}

	public void setAidv(String aidv) {
		this.aidv = aidv;
	}

	

	public String getContentv() {
		return contentv;
	}

	public void setContentv(String contentv) {
		this.contentv = contentv;
	}

	public Y getY() {
		return y;
	}

	public void setY(Y y) {
		this.y = y;
	}

	

	
	
	
	

}

2.hbm.xml配置

一端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-8-25 14:36:24 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="xyz.askway.pojo.Y" table="tb_testUser">
    
        <id name="puidl" column="puid">
            <generator class="assigned" />
        </id>
        
        <property name="unamel" column="tname"/>
       
        <property name="sexl" column="sex"/>
        
        <!-- name放多端集合名,table放多端的表名,cascade表示級聯操作 -->
        <set name="dSetl" table="tb_article" cascade="save-update">
            <key>
                <!-- column放多端表的外來鍵欄位名 -->
                <column name="fuid" />
            </key>
            <!-- class放多端類的全路徑名 -->
            <one-to-many class="xyz.askway.pojo.D" />
        </set>
    </class>
</hibernate-mapping>

多端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-8-25 14:36:24 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="xyz.askway.pojo.D" table="tb_article">
        <id name="aidv" column="aid" >
            <generator class="assigned" />
        </id>
        <property name="contentv" column="content" />
        
        <!-- name放一端的物件屬性名,class放一端類的全路徑名 -->
        <many-to-one name="y" class="xyz.askway.pojo.Y">
          <!-- column放tb_article(本表的外來鍵欄位名) -->
            <column name="fuid" />
        </many-to-one>
        
    </class>
</hibernate-mapping>

多對多:<many-to-many name=""></many-to-many>

多對多主要操作的是關係表,操作關係集合就是操作關係表。

刪除關係表中的一條資料:移除關係集合的一個關係物件就可以了,(新增也是同理的操作)。

資料庫結構

-- 1.tb_st_area 抄表轄區
CREATE TABLE tb_st_area(
	id_sy_area VARCHAR(37) PRIMARY KEY, -- ID主鍵 UUID()
	_area_name VARCHAR(50),             -- 抄表轄區名稱
	_remark	VARCHAR(200),                -- 備註
	_disabled	INT DEFAULT 0              -- 禁用 (0可使用 1已禁用)
);

-- 2.SY_Emp 員工
CREATE TABLE tb_sy_emp(
	id_sy_emp	VARCHAR(37) PRIMARY KEY, -- 主鍵,UUID()
	emp_name	varchar(50),         -- 員工姓名
	emp_no	varchar(10),           -- 工號
	_pwd	varchar(20),	           -- 密碼 (MD5加密)
	dept_id	int,	                 -- 部門ID
	_remark	varchar(200),	         -- 備註
	_disabled	INT DEFAULT 0      	 -- 禁用 (0可使用 1已禁用)
);

-- 員工抄表轄區關係表
CREATE TABLE tb_sy_emp_area_power(
	id_sy_emp_area_power VARCHAR(37) PRIMARY KEY, -- 主鍵,UUID()
	emp_id	int,   -- 員工ID
	area_id	int	   -- 抄表轄區ID
);

 1.實體類部署:

員工實體類

package com.waterworks.pojo;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
import java.util.UUID;

import com.waterworks.util.MD5;
import com.waterworks.util.MenuComparator;

/**
 * @ClassName:tb_sy_emp 
 * @Description: TODO(類說明:員工 )
 * @author  
 * @date 2018-08-23 20:22:49
 */ 
public class SyEmp implements Serializable{
	private static final long serialVersionUID = 1L;
	private String idSyEmp; 	//主鍵,UUID()
	private String empName; 	//員工姓名
	private String empNo; 	//工號
	private String pwd; 	//密碼 (MD5加密)
	private String remark; 	//備註
	private Integer disabled=0; 	//禁用 (0可使用 1已禁用)
	private Integer deptId; //部門ID
	private SyDept dept;  //部門物件



	private Set<StArea> areaSet = new HashSet<StArea>();//抄表轄區
	




	
	/**
	 * @Description: TODO(無參構造方法) 
	 */ 
	public SyEmp(){
	}
	/**
	 * @Description: TODO(有參構造方法) 
	 * @param idSyEmp	主鍵,UUID()
	 * @param empName	員工姓名
	 * @param empNo	工號
	 * @param pwd	密碼 (MD5加密)
	 * @param deptId	部門ID
	 * @param remark	備註
	 * @param disabled	禁用 (0可使用 1已禁用)
	 */ 
	public SyEmp(String idSyEmp,String empName,String empNo,String pwd,String remark,Integer disabled){
		this.idSyEmp=idSyEmp;
		this.empName=empName;
		this.empNo=empNo;
		this.pwd=pwd;
		this.remark=remark;
		this.disabled=disabled;
	}
	

	/**
	 * @return the beComment
	 */
	public Set<BeComment> getBeComment() {
		return beComment;
	}
	/**
	 * @param beComment the beComment to set
	 */
	public void setBeComment(Set<BeComment> beComment) {
		this.beComment = beComment;
	}
	/**
	 * @Title:setIdSyEmp 
	 * @Description: TODO(設定IdSyEmp	主鍵,UUID())
	 * @param idSyEmp
	 */ 
	public void setIdSyEmp(String idSyEmp){
		this.idSyEmp=idSyEmp;
	}
	/**
	 * @Title:setIdSyEmp 
	 * @Description: TODO(得到IdSyEmp	主鍵,UUID())
	 * @return String
	 */ 
	public String getIdSyEmp(){
		return idSyEmp;
	}
	/**
	 * @Title:setEmpName 
	 * @Description: TODO(設定EmpName	員工姓名)
	 * @param empName
	 */ 
	public void setEmpName(String empName){
		this.empName=empName;
	}
	/**
	 * @Title:setEmpName 
	 * @Description: TODO(得到EmpName	員工姓名)
	 * @return String
	 */ 
	public String getEmpName(){
		return empName;
	}
	/**
	 * @Title:setEmpNo 
	 * @Description: TODO(設定EmpNo	工號)
	 * @param empNo
	 */ 
	public void setEmpNo(String empNo){
		this.empNo=empNo;
	}
	/**
	 * @Title:setEmpNo 
	 * @Description: TODO(得到EmpNo	工號)
	 * @return String
	 */ 
	public String getEmpNo(){
		return empNo;
	}
	/**
	 * @Title:setPwd 
	 * @Description: TODO(設定Pwd	密碼 (MD5加密))
	 * @param pwd
	 */ 
	public void setPwd(String pwd){
		this.pwd=pwd;
	}
	/**
	 * @Title:setPwd 
	 * @Description: TODO(得到Pwd	密碼 (MD5加密))
	 * @return String
	 */ 
	public String getPwd(){
		return pwd;
	}


	/**
	 * @Title:setRemark 
	 * @Description: TODO(設定Remark	備註)
	 * @param remark
	 */ 
	public void setRemark(String remark){
		this.remark=remark;
	}
	/**
	 * @Title:setRemark 
	 * @Description: TODO(得到Remark	備註)
	 * @return String
	 */ 
	public String getRemark(){
		return remark;
	}
	/**
	 * @Title:setDisabled 
	 * @Description: TODO(設定Disabled	禁用 (0可使用 1已禁用))
	 * @param disabled
	 */ 
	public void setDisabled(Integer disabled){
		this.disabled=disabled;
	}
	/**
	 * @Title:setDisabled 
	 * @Description: TODO(得到Disabled	禁用 (0可使用 1已禁用))
	 * @return Integer
	 */ 
	public Integer getDisabled(){
		return disabled;
	}
	
	/**Function:得到部門物件
	 * Analysis:
	 * @return the dept
	 * @author WANGLiMiN
	 */
	public SyDept getDept() {
		return dept;
	}
	/**Function:設定部門物件
	 * Analysis:
	 * @param dept the dept to set
	 * @author WANGLiMiN
	 */
	public void setDept(SyDept dept) {
		this.dept = dept;
	}
	/**Function:
	 * Analysis:
	 * @return the deptId
	 * @author WANGLiMiN
	 */
	public Integer getDeptId() {
		return deptId;
	}
	/**Function:
	 * Analysis:
	 * @param deptId the deptId to set
	 * @author WANGLiMiN
	 */
	public void setDeptId(Integer deptId) {
		this.deptId = deptId;
	}

	/**
	 * Function:初始化Emp物件
	 * Analysis:
	 * @author WANGLiMiN
	 */
	public SyEmp initEmp() {
		this.setIdSyEmp(UUID.randomUUID()+"");
		this.setPwd(MD5.getMD5ofStr(this.getPwd()));
		return this;
	}

	/* (非 Javadoc) 
	* <p>Title: toString</p> 
	* <p>Description: </p> 
	* @return 
	* @see java.lang.Object#toString() 
	*/
	@Override
	public String toString() {
		return "SyEmp [idSyEmp=" + idSyEmp + ", empName=" + empName + ", empNo=" + empNo + ", pwd=" + pwd + ", remark="
				+ remark + ", disabled=" + disabled + ", deptId=" + deptId + "]";
	}

	/**Function:
	 * Analysis:
	 * @return the areaSet
	 * @author WANGLiMiN
	 */
	public Set<StArea> getAreaSet() {
		return areaSet;
	}
	/**Function:
	 * Analysis:
	 * @param areaSet the areaSet to set
	 * @author WANGLiMiN
	 */
	public void setAreaSet(Set<StArea> areaSet) {
		this.areaSet = areaSet;
	}
	

	

}

抄表轄區實體類

package com.waterworks.pojo;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

/**
 * @ClassName:tb_st_area 
 * @Description: TODO(類說明:抄表轄區 )
 * @author  
 * @date 2018-08-23 20:22:49
 */ 
public class StArea implements Serializable{
	private static final long serialVersionUID = 1L;
	private Integer idSyArea; 	//ID主鍵 
	private String areaName; 	//抄表轄區名稱
	private String remark; 	//備註
	private Integer disabled=0; 	//禁用 (0可使用 1已禁用
	private String checkbox="";
	private Set<SyEmp> empSet = new HashSet<SyEmp>();//員工
	
	/**
	 * @Description: TODO(無參構造方法) 
	 */ 
	public StArea(){
	}
	/**
	 * @Description: TODO(有參構造方法) 
	 * @param idSyArea	ID主鍵 
	 * @param areaName	抄表轄區名稱
	 * @param remark	備註
	 * @param disabled	禁用 (0可使用 1已禁用
	 */ 
	public StArea(Integer idSyArea,String areaName,String remark,Integer disabled){
		this.idSyArea=idSyArea;
		this.areaName=areaName;
		this.remark=remark;
		this.disabled=disabled;
	}
	/**
	 * @Title:setIdSyArea 
	 * @Description: TODO(設定IdSyArea	ID主鍵 )
	 * @param idSyArea
	 */ 
	public void setIdSyArea(Integer idSyArea){
		this.idSyArea=idSyArea;
	}
	/**
	 * @Title:setIdSyArea 
	 * @Description: TODO(得到IdSyArea	ID主鍵 )
	 * @return Integer
	 */ 
	public Integer getIdSyArea(){
		return idSyArea;
	}
	/**
	 * @Title:setAreaName 
	 * @Description: TODO(設定AreaName	抄表轄區名稱)
	 * @param areaName
	 */ 
	public void setAreaName(String areaName){
		this.areaName=areaName;
	}
	/**
	 * @Title:setAreaName 
	 * @Description: TODO(得到AreaName	抄表轄區名稱)
	 * @return String
	 */ 
	public String getAreaName(){
		return areaName;
	}
	/**
	 * @Title:setRemark 
	 * @Description: TODO(設定Remark	備註)
	 * @param remark
	 */ 
	public void setRemark(String remark){
		this.remark=remark;
	}
	/**
	 * @Title:setRemark 
	 * @Description: TODO(得到Remark	備註)
	 * @return String
	 */ 
	public String getRemark(){
		return remark;
	}
	/**
	 * @Title:setDisabled 
	 * @Description: TODO(設定Disabled	禁用 (0可使用 1已禁用)
	 * @param disabled
	 */ 
	public void setDisabled(Integer disabled){
		this.disabled=disabled;
	}
	/**
	 * @Title:setDisabled 
	 * @Description: TODO(得到Disabled	禁用 (0可使用 1已禁用)
	 * @return Integer
	 */ 
	public Integer getDisabled(){
		return disabled;
	}
	/**
	 * @Title:toString 
	 * @Description: TODO(toString)
	 */ 
	public String toString() { 
		return "StArea[idSyArea=" + idSyArea + ",areaName=" + areaName + ",remark=" + remark + ","+
		"disabled=" + disabled + "]";
	}
	/**Function:
	 * Analysis:
	 * @return the empSet
	 * @author WANGLiMiN
	 */
	public Set<SyEmp> getEmpSet() {
		return empSet;
	}
	/**Function:
	 * Analysis:
	 * @param empSet the empSet to set
	 * @author WANGLiMiN
	 */
	public void setEmpSet(Set<SyEmp> empSet) {
		this.empSet = empSet;
	}
	/**Function:
	 * Analysis:
	 * @return the checkbox
	 * @author WANGLiMiN
	 */
	public String getCheckbox() {
		return checkbox;
	}
	/**Function:
	 * Analysis:
	 * @param checkbox the checkbox to set
	 * @author WANGLiMiN
	 */
	public void setCheckbox(String checkbox) {
		this.checkbox = checkbox;
	}
	
	
	
}

2.hbm.xml配置

員工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-8-25 10:06:54 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping package="com.waterworks.pojo" >
    <class name="SyEmp" table="tb_sy_emp" lazy="false">
        <id name="idSyEmp" column="id_sy_emp">
            <generator class="assigned" />
        </id>

        <property name="empName" column="emp_name"/>
        
        <property name="empNo" column="emp_no"/>
        
        <property name="pwd" column="_pwd"/>
        
        <property name="remark" column="_remark"/>
        
        <property name="disabled" column="_disabled"/>
        


         <!-- 員工-抄表轄區許可權表(多對多) -->
         <!-- name放物件集合名,table放關係表名,inverse維護關係(true:放棄維護許可權,false:不放棄維護許可權)cascade="none"(不進行級聯操作) -->
        <set name="areaSet" table="tb_sy_emp_area_power" inverse="false" cascade="none" lazy="false">
            <!-- column放關係表中與本表有關係的外來鍵欄位名 -->
            <key column="emp_id"></key>
            <!-- class放另外一張表的實體類全路徑名, column放關係表中與另外一張表有關係的外來鍵欄位名 -->
            <many-to-many class="com.waterworks.pojo.StArea" column="area_id"></many-to-many>
        </set>

     
        
    </class>
</hibernate-mapping>

抄表轄區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??8??22?? ????10:52:54 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="com.waterworks.pojo.StArea" table="tb_st_area">
        <id name="idSyArea" column="id_sy_area">
            <generator class="native" />
        </id>
        <property name="areaName" column="_area_name" />
        <property name="remark" column="_remark" />
        <property name="disabled" column="_disabled" />
        <!-- 員工-抄表轄區許可權表(多對多) -->
        <!-- name放物件集合名,table放關係表名,inverse維護關係(true:放棄維護許可權,false:不放棄維護許可權)cascade="none"(不進行級聯操作) -->
        <set name="empSet" table="tb_sy_emp_area_power" inverse="true" cascade="none" lazy="false">
           <!-- column放關係表中與本表有關係的外來鍵欄位名 -->
           <key column="area_id"></key>
           <!-- class放另外一張表實體類的全路徑名 column放關係表中與另外一張表有關係的外來鍵欄位名 -->
           <many-to-many class="com.waterworks.pojo.SyEmp" column="emp_id"></many-to-many>
        </set>
        
    </class>
</hibernate-mapping>