JPA学习笔记-EJB-04JPA关联映射总结(2)
时间:2025-02-27
时间:2025-02-27
可以看出里面有一个Set<UxRole>,
代表角色实体不能重复,当然判断UxRole是否重复的算法需要在UxRole里自己实现,此为后话暂且不表。
的一个中间桥梁,根据用户找到用户的角色,再根据角色才能找到该用户能使用的操作菜单。并且角色组下的用户和菜单都不能重复。
UxSysMenu(菜单)
其中Set<UxRole>是菜单实体到角色的映射。
4. 实体类代码
有了类图,就有了实体类代码了。
import org.apache.struts2.json.annotations.JSON;
/** * liuyan */ @Entity @Table(name = "ux_admin") public class UxAdmin implements java.io.Serializable { // Fields private Integer id; private String admin; private String password; private Set<UxRole> roles; // Constructors /** default constructor */ public UxAdmin() { } /** minimal constructor */ public UxAdmin(Integer id) { this.id = id; } /** full constructor */ public UxAdmin(Integer id, String admin, String password) { this.id = id; this.admin = admin; this.password = password; } // Property accessors @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id", unique = true, nullable = false) public Integer getId() { return this.id; } public void setId(Integer id) {4 / 23
说明1:不要理睬getRoles()的@JSON(serialize = false)注解,这个和JPA无关 说明2:@ManyToMany(fetch = ZY)注解,说明UxAdmin与UxRole是多对多的关系,采用的是默认的懒加载机制,而且从UxRole来看,是双向的多对多关联。所以必须采用专门的维护关系表来维护多对多关联关系。
说明3:@JoinTable( )注解,利用表名为ux_sys_user_role作为关系维护表。UxAdmin实体表用字段adminId作为ux_sys_user_role的外键,用于维护UxAdmin实体。roleId是维护另一个实体——UxRole的roleId字段。之所以用Set作为集合关联,是因为需求不能让用户的角色重复。inverseJoinColumns是定义指向非所有者主表的外键列。
UxSysMenu
this.smenuname = smenuname; this.iparentid = iparentid; this.isvisible = isvisible; this.ilevel = ilevel; } /** full constructor */ public UxSysMenu(Integer imenuid, String smenuname, String smenuurl, Integer iparentid, Integer iorder, String simgico, String isvisible, Integer ilevel) { this.imenuid = imenuid; this.smenuname = smenuname; this.smenuurl = smenuurl; this.iparentid = iparentid; this.iorder = iorder; this.simgico = simgico; this.isvisible = isvisible; this.ilevel = ilevel; } //去掉双向关联映射,为了更新菜单时不影响角色实体记录 private Set<UxRole> uxRoles; @JSON(serialize = false) @ManyToMany(fetch = ZY) @JoinTable(name = "ux_sys_role_menu", joinColumns = { @JoinColumn(name = "menuId") }, inverseJoinColumns = { @JoinColumn(name = "roleId") }) public Set<UxRole> getUxRoles() { return uxRoles; } public voi
d setUxRoles(Set<UxRole> uxRoles) { this.uxRoles = uxRoles; } // Property accessors @Id @Column(name = "imenuid", unique = true, nullable = false) public Integer getImenuid() { return this.imenuid; }
7 / 23
public void setImenuid(Integer imenuid) { this.imenuid = imenuid; } @Column(name = "smenuname", nullable = false, length = 512) public String getSmenuname() { return this.smenuname; } public void setSmenuname(String smenuname) { this.smenuname = smenuname; } @Column(name = "smenuurl", length = 128) public String getSmenuurl() { return this.smenuurl; } public void setSmenuurl(String smenuurl) { this.smenuurl = smenuurl; } @Column(name = "iparentid", nullable = false) public Integer getIparentid() { return this.iparentid; } public void setIparentid(Integer iparentid) { this.iparentid = iparentid; } @Column(name = "iorder") public Integer getIorder() { return this.iorder; } public void setIorder(Integer iorder) { this.iorder = iorder; } @Column(name = "simgico", length = 64) public String getSimgico() { return this.simgico; }8 / 23
public void setSimgico(String simgico) { this.simgico = simgico; } @Column(name = "isvisible", nullable = false, length = 8) public String getIsvisible() { return this.isvisible; } public void setIsvisible(String isvisible) { this.isvisible = isvisible; } @Column(name = "ilevel", nullable = true) public Integer getIlevel() { return this.ilevel; } public void setIlevel(Integer ilevel) { this.ilevel = ilevel; } /** * 是否主键相等 */ @Override public boolean equals(Object obj) { if(obj instanceof UxSysMenu){ UxSysMenu uxSysMenu = (UxSysMenu)obj; if(uxSysMenu.imenuid == this.imenuid){ return true; } } return false; } @Override public int hashCode() { // TODO Auto-generated method stub return this.imenuid;9 / 23
超级父类Object的equals(Object obj)、hashCode()方法,这样在别的管理实体的Set<UxSysMenu>就可以区分集合中的元素哪些实体是重复的。
下面来看角色实体
UxRole
@ManyToMany(fetch = ZY) @JoinTable(name = "ux_sys_role_menu", joinColumns = { @JoinColumn(name = "roleId") }, inverseJoinColumns = { @JoinColumn(name = "menuId") }) private Set<UxSysMenu> menus;
@ManyToMany(fetch = ZY) @JoinTable(name = "ux_sys_user_role", joinColumns = { @JoinColumn(name = "roleId") }, inverseJoinColumns = { @JoinColumn(name = "adminId") }) private Set<UxAdmin> uxAdmins; // Constructors /** default constructor */ public UxRole() { } /** minimal constructor */ public UxRole(Integer id) { this.id = id; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getRoleName() { return roleName; } public void setRoleName(String roleName) { this.roleName = role …… 此处隐藏:6209字,全部文档内容请下载后查看。喜欢就下载吧 ……