首先新建三张表:t_user,t_user_role_relation,t_role
CREATE TABLE t_user
(
uid INT NOT NULL AUTO_INCREMENT COMMENT 'user id',
uname VARCHAR(32) NOT NULL COMMENT 'user name, real chinese name ',
mobile VARCHAR(15) NOT NULL COMMENT 'phone number',
type INT NOT NULL COMMENT '0:普通用户(巡防员,联防员), 1:治安管理人员(WEB端,警长,各级治安管理人员), 10:信息员,11:备勤人员,',
password VARCHAR(128) NOT NULL COMMENT 'encrypt password',
org_id INT COMMENT 'the organization of user. -1:none',
id_number VARCHAR(30) NOT NULL COMMENT 'id card number',
note VARCHAR(255),
status INT COMMENT '0:normal, 1:wait approve, 2:freeze , 9:disable',
avatar VARCHAR(64) COMMENT '头像ID',
create_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (uid),
UNIQUE IXUK_t_user_mobile(mobile),
INDEX IXFK_t_user_t_organization (org_id ASC),
INDEX IX_t_user_uname (uname ASC)
) COMMENT='用户表,临时用户表t_user_temp和t_user一致,用于记录临时用户或者注册未通过用户。临时用户对应t_user表中一条临时用户的记录'
;
CREATE TABLE t_user_role_relation
(
uid INT NOT NULL,
role_id INT NOT NULL,
PRIMARY KEY (uid, role_id),
INDEX IXFK_t_user_role_relation_t_role (role_id ASC),
INDEX IXFK_t_user_role_relation_t_user (uid ASC)
)
;
CREATE TABLE t_role
(
role_id INT NOT NULL AUTO_INCREMENT,
parent_id INT NOT NULL,
role_name VARCHAR(50) NOT NULL,
note VARCHAR(255),
create_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (role_id)
)
;
其中,t_user_role_relation是张关联表,t_user与t_user_role_relation是一对多的关系,t_user_role_relation与t_role是多对一的关系,现在在表t_user通过t_user_role_relation拿到t_role中角色名称role_name字段值
首先在t_user中配置一对多关系:
package com.cshtong.tower.model;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction;
@Entity
@Table(name = "t_user")
public class User {
@Id
@GeneratedValue
private Integer uid;
@OneToMany(cascade=CascadeType.ALL,mappedBy="uid",fetch=FetchType.EAGER)
@NotFound(action=NotFoundAction.IGNORE)
private List<UserRoleRelation> userRoleRelation=new ArrayList<UserRoleRelation>();
public List<UserRoleRelation> getUserRoleRelation() {
return userRoleRelation;
}
public void setUserRoleRelation(List<UserRoleRelation> userRoleRelation) {
this.userRoleRelation = userRoleRelation;
}
private String uname;
private String mobile;
private Integer type;
private String password;
@Column(name="org_id")
private Integer orgId;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name="org_id",referencedColumnName="org_id",insertable=false,updatable=false,nullable=false)
@NotFound(action=NotFoundAction.IGNORE)
private Organization organization;
@Column(name="id_number")
private String idNumber;
private String note;
private Integer status;
private String avatar;
@Column(name = "create_time")
private Date createTime;
@Column(name = "update_time")
private Date updateTime;
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getOrgId() {
return orgId;
}
public void setOrgId(Integer orgId) {
this.orgId = orgId;
}
public String getIdNumber() {
return idNumber;
}
public void setIdNumber(String idNumber) {
this.idNumber = idNumber;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
public String getAvatar() {
return avatar;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public Organization getOrganization() {
return organization;
}
public void setOrganization(Organization organization) {
this.organization = organization;
}
}
在JPA中,用@OneToMany来标识一对多的关系。实现一对多的单向关联,只需在代表一的实体(User)中使用@OneToMany映射标注就可以了,代表多的实体不需要使用任何映射标注。
有两种方式实现一对多的单向关联。一种是在只使用@OneToMany来标识,这种方式是通过一张第三方表来保存关系。还有一种是使用@OneToMany和@JoinColumn来标注,这种方式是在多的一方(User)的表中增加一个外键列来保存关系。
上述例子是通过第一种方法来配置的,配置mappedBy="uid"属性后,可避免生成第三方表
t_user_role_relation与t_role的多对一配置如下:
package com.cshtong.tower.model;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction;
@Entity
@Table(name = "t_user_role_relation")
@IdClass(UserRoleRelationPK.class)
public class UserRoleRelation {
@Id
private Integer uid;
@Id
@Column(name="role_id")
private Integer roleId;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="role_id",referencedColumnName="role_id",insertable=false,updatable=false,nullable=false)
@NotFound(action=NotFoundAction.IGNORE)
private Role role;
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public Integer getRoleId() {
return roleId;
}
public void setRoleId(Integer roleId) {
this.roleId = roleId;
}
}
t_role表不做任何配置:
package com.cshtong.tower.model;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "t_role")
public class Role {
@Id
@GeneratedValue
@Column(name="role_id")
private Integer roleId;
@Column(name="parent_id")
private Integer parentId;
@Column(name="role_name")
private String roleName;
private String note;
@Column(name="create_time")
private Date createTime;
@Column(name="update_time")
private Date updateTime;
public Integer getRoleId() {
return roleId;
}
public void setRoleId(Integer roleId) {
this.roleId = roleId;
}
public Integer getParentId() {
return parentId;
}
public void setParentId(Integer parentId) {
this.parentId = parentId;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
}
最后在html中取得用户的编号、姓名、手机号、所属机构、用户角色信息:
<td><div class="td td-w70">{{value.uid}}</div></td>
<td><div class="td td-w70">{{value.uname}}</div></td>
<td><div class="td td-w100">{{value.mobile}}</div></td>
<td><div class="td td-w140">{{value.organization.name}}</div></td>
{{if value.userRoleRelation.length > 0}}
<td>
{{each value.userRoleRelation as values j}}
<span class="td td-w90">{{values.role.roleName}}</span>
{{/each}}
</td>
{{else}}
最后的数据格式如图所示: