近日拿起好久没碰的JAVA重新看了看,发现变化还真是大。在看Hiberhate时,发现他的ManyToMany用起来不是很方便,到网上一搜发现很多人都并没有完全了解这个关联关系的用法,为了造福人类,干脆我来个用例大全算了。
在使用Hiberhate的关联映射时,不管你是双向还是单向,都是有主控方的,主控方的操作会自动的影响关联关系(中间表),对于双向多对多来说,主控方的操作则会自动的影响中间表,如果需要影响到被控方表内的数据,则需要进行CascadeType配置。
但是当你在被控方操作数据时,被控方并不能影响到关联关系(中间表),如果要修改关联关系则需要配置CascadeType属性,同时配置了该属性也会影响到主控方表内的数据。
例子:
假设我们要设计一个角色与组织机构对应的维护功能,对应表结构如下:
组织机构表:org 角色表:role 中间表:org_role
id,name,description id,name,parentId,description orgId,roleId
通常在此类功能中,角色和机构都是单独添加,但是在添加和维护的过程中需要同步二者的关联关系。
实体类及annotation配置,注意红色字体,代码中CascadeType.PERSIST是为了演示而特地加入,实际应用中基本不用设置该选项,只需设置CascadeType.MERGE便可
org:
package org.taomujian.model;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table(name="org")
public class Org {
private String id ;
private String name;
private String description;
private List<Role> roleList = new ArrayList<Role>();
@Id
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
// @ManyToMany(mappedBy="orgList",cascade={CascadeType.ALL},fetch=FetchType.EAGER)
@ManyToMany(mappedBy="orgList",fetch=FetchType.EAGER,cascade={CascadeType.MERGE})
public List<Role> getRoleList() {
return roleList;
}
public void setRoleList(List<Role> roleList) {
this.roleList = roleList;
}
@Override
public boolean equals(Object obj) {
boolean flag = false;
if(!(obj instanceof Org)){
flag = false;
}else {
Org org = (Org)obj;
if(org.getId().equals(this.getId())){
flag = true;
}
}
return flag;
}
@Override
public int hashCode() {
int result = id.hashCode();
result = result+(int)'f';
return result;
}
}
role:
package org.taomujian.model;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table(name="role")
public class Role {
private String id;
private String name;
private String parentId;
private String description;
private List<Org> orgList = new ArrayList<Org>();
public Role(){
}
public Role(String id, String name, String parentId, String discription) {
this.id = id;
this.name = name;
this.parentId = parentId;
this.description = discription;
}
@Id
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
// @ManyToMany(cascade={CascadeType.ALL})
@ManyToMany(fetch=FetchType.EAGER,cascade={CascadeType.MERGE,CascadeType.PERSIST})
@JoinTable(
name="org_role",
joinColumns={@JoinColumn(name="roleId",referencedColumnName="id")},
inverseJoinColumns={@JoinColumn(name="orgId",referencedColumnName="id")}
)
public List<Org> getOrgList() {
return orgList;
}
public void setOrgList(List<Org> orgList) {
this.orgList = orgList;
}
//重写该方法,以辨别是否是同一条数据
@Override
public boolean equals(Object obj) {
boolean flag = false;
if(!(obj instanceof Org)){
flag = false;
}else {
Org org = (Org)obj;
if(org.getId().equals(this.getId())){
flag = true;
}
}
return flag;
}
@Override
public int hashCode() {
int result = id.hashCode();
result = result+(int)'f';
return result;
}
}
在hibernate.cfg.xml增加实体类的配置
<mapping class="org.taomujian.model.Org"/>
<mapping class="org.taomujian.model.Role"/>
分享到:
相关推荐
这个是一个简单的实现manytomany的例子,这样可以实现数据库中多对多的关系 这个项目演示了如何配置多对多,使多对多的关系很明朗。
用于映射多对多关系的 Hibernate 注释
hibernate5_ManyToMany多对多单向维护 hibernate5_ManyToMany多对多单向维护
本程序包含: hibenate 上传图片,二进制数据,大文本,集合映射的多种关系,onetoone,ontomany,manytomany等关系详细代码示例以及注释,全部由本人测试通过,对理解hibernate配置有极大帮助。
hibernate对象三状态及OneToOne&OneToMany&ManyToMany讲解,代码示例,数据库示例!非常全面
hibernate中manytomany关系 实体类中有个集合方的是这个实体类本身
NULL 博文链接:https://chen-rojer-gmail-com.iteye.com/blog/696471
SpringBoot-SpringData-ManyToMany,博文:http://blog.csdn.net/ABAP_Brave/article/details/52849827
manytomany注解模式.rar manytomany注解模式.rar
趟坑 ManyToMany 循环引用 死循环 栈内存溢出问题
JPA课程manyToMany OneToMany 等全部测试 注解, 有注释
NULL 博文链接:https://cdxs2.iteye.com/blog/1932869
问题:如何跨多对多关系的两个实体投影列示例:员工(id、名字、姓氏)会议(id、主题、会议日期) 假设我们有员工数据 1 , A, AA 2 , B, BB 会议 1,AB 会议,X 2,另一个会议,X 3,仅 B Employee_Meeting AB A 和...
Hibernate注释大全收藏 声明实体Bean @Entity public class Flight implements Serializable { Long id; @Id public Long getId() { return id; } public void setId(Long id) { this.id = id; } } @Entity ...
spring data jpa 的多表联查 多对多操作 案例:用户和角色(多对多关系) 用户: 角色:
NULL 博文链接:https://lc2586.iteye.com/blog/722671
对于一对多的双向映射,如果要一对多这一端维护关联关系,你需要删除mappedBy元素并将多对一这端的@JoinColoumn的insertable和updatabel设置为false。这种方案不会得到什么明显的优化,而且还会增加一些附加的UPDATE...
多对多用于多态和非多态ManyToMany关系的Laravel Nova字段。目录特征在创建和更新页面中附加多态和非多态的ManyToMany关系附加关系时编辑枢轴列将源多次附加到另一个资源安装composer require armincms/many-to-many...
主要介绍了Django多层嵌套ManyToMany字段ORM操作详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
@ManyToMany 一方写 mappedBy 放弃外键维护、另一方 @JoinTable 维护中间表 收派标准修添加能实现 html 请求 后台处理 服务器端Service和DAO编写整合springdatajpa 业务层接口 修改 Action 代码调用 ...