欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hibernate关联关系

程序员文章站 2022-04-23 11:49:18
...

目录

一对一:

一对多 :数据库表结构:

   1.实体类的部署:

    2.hbm.xml配置

多对多:

数据库结构

 1.实体类部署:

2.hbm.xml配置


                  关联关系在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>