近日拿起好久没碰的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"/>