Hibernate单向一对多JPA注解

本文介绍了如何在Hibernate中使用JPA注解实现单向一对多的关系,以用户表`t_user`、角色关系表`t_user_role_relation`和角色表`t_role`为例。在`t_user`表中通过`@OneToMany`注解建立与`t_user_role_relation`的关联,并通过`mappedBy`属性避免生成中间表。同时,展示了`t_user_role_relation`与`t_role`的多对一关系配置。
摘要由CSDN通过智能技术生成

首先新建三张表: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}}                                                   
最后的数据格式如图所示:









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值