Hibernate关联关系
程序员文章站
2022-04-23 11:49:18
...
目录
关联关系在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>
上一篇: 关联关系映射