Hibernate關聯關係
阿新 • • 發佈:2018-12-09
關聯關係在orm框架中是一個比較重要的一部分,在學習Hibernate框架的朋友可以重點的關注一下。
關聯關係通俗一點來說就是資料庫表與表之間的關係(主外來鍵關係),hibernare框架弱化了資料庫表的一些操作,強化了實體類的操作,在hibernate中操作實體類就等同於操作資料庫表。
關聯關係分為三種:一對一、一對多、多對多
一對一:<one-to-one name=""></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>