(十三)Hibernate中的多表操作(3):单向多对多
- 多对多的处理方式是,有一张中间表,中间表保存两个多方之间的关系。首先来看实际应用场景:在之前开发的系统中,应用了基于角色的控制访问,也就是RBAC模型,一个用户可能存在多种角色,一种角色也可能有多个用户,所以用户和角色之间是一个多对多的关系。
案例一: 使用注解方式实现多对多关系
- RoleBean.java
package bean; import java.io.Serializable;
import java.util.HashSet;
import java.util.Set; import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table; @Entity
@Table(name = "role")
public class RoleBean implements Serializable { @Id
private Integer role_id;
private String role_name;
private String role_remark; @ManyToMany
@JoinTable(name = "role_menu", // //name=”role_menu”中间表的名称是“role_menu”
joinColumns = { @JoinColumn(name = "roleid") }, //设置当前实体在中间表中的映射,也就是说在中间表中有一个字段叫roleid,使它指向当前表的主键这里是role_id
inverseJoinColumns = { @JoinColumn(name = "menu_id") }) //设置对方实体在中间中的映射,也就是说在中间表中有一个字段menu_id,使它指向对方表(menu表)的主键。
private Set<MenuBean> menuSet = new HashSet<MenuBean>(); public RoleBean(Integer role_id, String role_name, String role_remark) {
super();
this.role_id = role_id;
this.role_name = role_name;
this.role_remark = role_remark;
} public RoleBean() {
} public Integer getRole_id() {
return role_id;
} public void setRole_id(Integer role_id) {
this.role_id = role_id;
} public String getRole_name() {
return role_name;
} public void setRole_name(String role_name) {
this.role_name = role_name;
} public String getRole_remark() {
return role_remark;
} public void setRole_remark(String role_remark) {
this.role_remark = role_remark;
} public Set<MenuBean> getMenuSet() {
return menuSet;
} public void setMenuSet(Set<MenuBean> menuSet) {
this.menuSet = menuSet;
} }
- MenuBean.java
package bean; import java.io.Serializable; import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table; @Entity
@Table(name = "menu")
public class MenuBean implements Serializable {
@Id
private Integer menuid;
private String menuname; public MenuBean() {
} public MenuBean(Integer menuid, String menuname) {
super();
this.menuid = menuid;
this.menuname = menuname;
} public Integer getMenuid() {
return menuid;
} public void setMenuid(Integer menuid) {
this.menuid = menuid;
} public String getMenuname() {
return menuname;
} public void setMenuname(String menuname) {
this.menuname = menuname;
} }
把两个含有注解的bean文件添加到总配置文件里即可实现。
案例二:使用xml配置文件实现单向多对多
- 创建实体类 Role.java
package bean; import java.util.HashSet;
import java.util.Set; /**
* Role entity. @author MyEclipse Persistence Tools
*/ public class Role implements java.io.Serializable { // Fields private Integer roleId;
private String roleName;
private String roleRemark; private Set<MenuBean> menuSet=new HashSet<MenuBean>();
// Constructors /** default constructor */
public Role() {
} /** minimal constructor */
public Role(Integer roleId) {
this.roleId = roleId;
} /** full constructor */
public Role(Integer roleId, String roleName, String roleRemark) {
this.roleId = roleId;
this.roleName = roleName;
this.roleRemark = roleRemark;
} // Property accessors public Integer getRoleId() {
return this.roleId;
} public void setRoleId(Integer roleId) {
this.roleId = roleId;
} public String getRoleName() {
return this.roleName;
} public void setRoleName(String roleName) {
this.roleName = roleName;
} public String getRoleRemark() {
return this.roleRemark;
} public void setRoleRemark(String roleRemark) {
this.roleRemark = roleRemark;
} public Set<MenuBean> getMenuSet() {
return menuSet;
} public void setMenuSet(Set<MenuBean> menuSet) {
this.menuSet = menuSet;
} }
- 创建实体类 MenuBean.java
package bean; /**
* MenuBean entity. @author MyEclipse Persistence Tools
*/ public class MenuBean implements java.io.Serializable { // Fields private Integer menuid;
private String menuname; /** default constructor */
public MenuBean() {
} /** minimal constructor */
public MenuBean(Integer menuid) {
this.menuid = menuid;
} /** full constructor */
public MenuBean(Integer menuid, String menuname) {
this.menuid = menuid;
this.menuname = menuname;
} // Property accessors public Integer getMenuid() {
return this.menuid;
} public void setMenuid(Integer menuid) {
this.menuid = menuid;
} public String getMenuname() {
return this.menuname;
} public void setMenuname(String menuname) {
this.menuname = menuname;
} }
- 把创建实体类的映射文件 Role.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Mapping file autogenerated by MyEclipse Persistence Tools -->
<hibernate-mapping>
<class name="bean.Role" table="role" catalog="test">
<id name="roleId" type="java.lang.Integer">
<column name="role_id" />
<generator class="assigned"></generator>
</id>
<property name="roleName" type="java.lang.String">
<column name="role_name" />
</property>
<property name="roleRemark" type="java.lang.String">
<column name="role_remark" />
</property>
<!-- 单向多对多 -->
<set name="menuSet" table="role_menu">
<key column="roleid"></key> <!-- 表示当前类映射到关系表中的列 -->
<many-to-many column="menu_id" class="bean.MenuBean" ></many-to-many> <!-- 所对应的另一方在关系表中的列 -->
</set> </class>
</hibernate-mapping>
- MenuBean.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="bean.MenuBean" table="menu" catalog="test">
<id name="menuid" type="java.lang.Integer">
<column name="menuid" />
<generator class="assigned"></generator>
</id>
<property name="menuname" type="java.lang.String">
<column name="menuname" />
</property>
</class>
</hibernate-mapping>
- 把两个映射文件添加到总配置文件里即可实现。
(十三)Hibernate中的多表操作(3):单向多对多的更多相关文章
- (转)Hibernate中的多表操作
http://blog.csdn.net/yerenyuan_pku/article/details/70556208 Hibernate中的多表操作 在实际开发中,我们不可能只是简简单单地去操作单表 ...
- (十五)Hibernate中的多表操作(5):双向多对多
Hibernate的双向关联. 对象之间可以相互读取. 双向只针对读取的操作.对于增.删除.改的操作没有任何影响. 案例 : 实现双向多对多 MenuBean.java package ...
- (十一)Hibernate中的多表操作(1):单向一对多
一.单向一对多() 案例一(用XML文件配置): 一个班级有多个学生,班级可以查看所有学生的信息. ClassBean.java package bean; import java.util.Hash ...
- (十二)Hibernate中的多表操作(2):单向多对一
由“多”方可知“一”方的信息,比如多个员工使用同一栋公寓,员工可以知道公寓的信息,而公寓无法知道员工的信息. 案例一:使用xml配置 pojo类 Group.java package bean; // ...
- (十四)Hibernate中的多表操作(4):单向一对一
案例一: 注解方式实现一对一 UserBean.java package bean; import java.io.Serializable; import javax.persistence.Col ...
- Hibernate中的多表查询及抓取策略
1.Hibernate中的多表查询 1.1SQL中的多表查询 [交叉连接] select * from A,B; [内连接] 显示内连接:inner join(inner 可以省略) Select * ...
- Hibernate超简单多表操作
所谓一对多映射 在数据库中我们通常会通过添加外键的方式将表关联起来,表现一对多的关系. 而在Hibernate中,我们则要通过在一方持有多方的集合来实现,即在"一"的一端中使用元素 ...
- 《Java从入门到放弃》入门篇:hibernate中的多表对应关系
hibernate中的对应关系其实就是数据库中表的对应关系, 就跟某些电影中的某些场景是一样一样滴. 比如可以是一男一女,还可以是一男多女, 更可以是多男一女,最后最后最后还可以是多男多女!!! 有些 ...
- Hibernate框架笔记03表操作多对多配置
目录 1. 数据库表与表之间的关系 1.1 一对多关系 1.2 多对多关系 1.3 一对一关系[了解] 2. Hibernate的一对多关联映射 2.1 创建一个项目,引入相关jar包 2.2. 创建 ...
随机推荐
- Python数据预处理(sklearn.preprocessing)—归一化(MinMaxScaler),标准化(StandardScaler),正则化(Normalizer, normalize)
关于数据预处理的几个概念 归一化 (Normalization): 属性缩放到一个指定的最大和最小值(通常是1-0)之间,这可以通过preprocessing.MinMaxScaler类实现. 常 ...
- java 获取String中的数字
随便给你一个含有数字的字符串,比如: String s="eert343dfg56756dtry66fggg89dfgf"; 那我们如何把其中的数字提取出来呢?大致有以下几种方法, ...
- 在 kubernetes 集群中部署一套 web 网站(网页内容不限)
环境准备 一台部署节点,一台master节点,还有两台节点node1,node2 完好的k8s集群环境 思路一: 在node1和node2节点上通过宿主机与容器之间目录映射和端口映射上线静态网站(或动 ...
- 123457123456#0#-----com.twoapp.mathGame13--前拼后广--13种数学方法jiemei
com.twoapp.mathGame13--前拼后广--13种数学方法jiemei
- Django之Form、跨站请求以及cookie、session
Form表单 常规html页面的form表单验证 常规页面中,如果想实现对表单中用户输入信息的数据验证,需要配合Ajax来实现. 使用前我们先来熟悉下函数参数:request,其中包含的意义: req ...
- EXCEL生成SQL脚本
有如下一张数据库表: 当然,Excel也是这个样子的,然后需要通过Excel的命令实现如下的脚本: insert into student(name,age) values('张三',15); 实现的 ...
- (十四)Centos之安装vsftp服务
一.为什么要安装vsftp服务 我们需要向centos操作系统的服务器上上传文件或者下载文件,这时候,ftp有必要安装下,我们选择主流的vsftp 二.安装 第一步:安装vsftp yum insta ...
- Django:reverse反转URL并传递参数
需求: 假设在文章详情页评论文章后需要重新刷新显示该页面(原始方法,提交评论表单为form方式,未采用ajax方式), 提交评论后代码会走comment的视图函数,等数据入库之后需要将页面重新定位到文 ...
- 白嫖百度 Tesla V100 笔记(在 AI Studio 上使用 tensorflow 和 pytorch 的方法)
登陆百度 AI Studio 并按照教程创建新项目 启动项目并进入控制台 下载 Anaconda3/Miniconda3 安装脚本 安装在 ~/work/*conda3 目录 输入命令 source ...
- 提高.NET应用性能
提高.NET应用性能的方法 写在前面 设计良好的系统,除了架构层面的优良设计外,剩下的大部分就在于如何设计良好的代码,.NET提供了很多的类型,这些类型非常灵活,也非常好用,比如List,Dictio ...