hibernate关联非主键注解配置
2017-06-26 14:32
316 查看
现在有两张表:一张t_s_user用户表和t_s_user_serial_number用户序号表
其中,t_s_user_serial_number表中的user_id字段是使用的t_s_user表中的主键,现在需要在用户实体中关联查询出用户序号数据。
![](https://images2015.cnblogs.com/blog/607158/201706/607158-20170614200055884-2070362748.png)
t_s_user实体类
表t_s_user_serial_number的实体类:
关键的注解就在TSUser实体类中:
只需要上面的配置,虽然使用的@ManyToOne,但是取出来的数据还是一对一的关系,用户表中的ID是一定的,用户序号表中的user_id字段也是唯一的,但是使用
CREATE TABLE `t_s_user` ( `id` varchar(32) NOT NULL, `email` varchar(50) DEFAULT NULL, `mobilePhone` varchar(30) DEFAULT NULL, `officePhone` varchar(20) DEFAULT NULL, `signatureFile` varchar(100) DEFAULT NULL, `update_name` varchar(32) DEFAULT NULL COMMENT '修改人', `update_date` datetime DEFAULT NULL COMMENT '修改时间', `update_by` varchar(32) DEFAULT NULL COMMENT '修改人id', `create_name` varchar(32) DEFAULT NULL COMMENT '创建人', `create_date` datetime DEFAULT NULL COMMENT '创建时间', `create_by` varchar(32) DEFAULT NULL COMMENT '创建人id', `last_slt_orgid` varchar(32) DEFAULT NULL, `checkPhone` varchar(30) DEFAULT NULL COMMENT '校验手机号', `job_title` varchar(100) DEFAULT NULL COMMENT '职务名称', `sex` int(1) DEFAULT NULL COMMENT '性别:1-男;2-女', `birthday` datetime DEFAULT NULL COMMENT '生日', `office` varchar(200) DEFAULT NULL COMMENT '办公室', `headpic` varchar(200) DEFAULT NULL COMMENT '头像', `qq` varchar(20) DEFAULT NULL COMMENT 'QQ号码', `job_number` varchar(50) DEFAULT NULL COMMENT '工号', `version` bigint(20) DEFAULT '1', `inviteCode` varchar(6) DEFAULT '' COMMENT '用户邀请码', PRIMARY KEY (`id`), KEY `FK_2cuji5h6yorrxgsr8ojndlmal` (`id`), CONSTRAINT `FK_2cuji5h6yorrxgsr8ojndlmal` FOREIGN KEY (`id`) REFERENCES `t_s_base_user` (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `t_s_user_serial_number` ( `sn` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户序号', `user_id` varchar(32) NOT NULL COMMENT '关联用户', PRIMARY KEY (`sn`), UNIQUE KEY `AK_Key_2` (`user_id`) ) ENGINE=InnoDB AUTO_INCREMENT=2023 DEFAULT CHARSET=utf8mb4 COMMENT='用户序号表';
其中,t_s_user_serial_number表中的user_id字段是使用的t_s_user表中的主键,现在需要在用户实体中关联查询出用户序号数据。
![](https://images2015.cnblogs.com/blog/607158/201706/607158-20170614200055884-2070362748.png)
t_s_user实体类
package org.jeecgframework.web.system.pojo.base; import com.sctf.oa.rest.entity.TokenEntity; import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicUpdate; import org.jeecgframework.poi.excel.annotation.Excel; import javax.persistence.*; import java.math.BigInteger; import java.util.Date; /** * 系统用户表 * @author 张代浩 */ @Entity @Table(name = "t_s_user") @PrimaryKeyJoinColumn(name = "id") @DynamicUpdate(true) @DynamicInsert(true) public class TSUser extends TSBaseUser implements java.io.Serializable { private static final long serialVersionUID = 1L; private String signatureFile;// 签名文件 @Excel(name = "手机号(请将本列设为文本格式,必填)") private String mobilePhone;// 手机 @Excel(name = "办公电话(非必填)") private String officePhone;// 办公电话 @Excel(name = "邮箱(非必填)") private String email;// 邮箱 /**创建时间*/ private java.util.Date createDate; /**创建人ID*/ private java.lang.String createBy; /**创建人名称*/ private java.lang.String createName; /**修改时间*/ private java.util.Date updateDate; /**修改人*/ private java.lang.String updateBy; /**修改人名称*/ private java.lang.String updateName; /**最后一次选择的组织机构*/ private java.lang.String lastSltOrgid; /**性别*/ private Integer sex; /**生日*/ private java.util.Date birthday; /**职务*/ private java.lang.String jobTitle; /**办公司*/ private String office; /**头像*/ private String headPic; private String checkPhone;// 校验手机号码 /**QQ号码*/ private String qq; /**工号*/ private String jobNumber; /**令牌信息*/ private TokenEntity tokenInfo; /**版本号**/ private BigInteger version; /**用户邀请码**/ private String inviteCode; /**用户序号**/ private TSUserSerialNumber userSerialNumber; @Column(name = "signatureFile", length = 100) public String getSignatureFile() { return this.signatureFile; } public void setSignatureFile(String signatureFile) { this.signatureFile = signatureFile; } @Column(name = "mobilePhone", length = 30) public String getMobilePhone() { return this.mobilePhone; } public void setMobilePhone(String mobilePhone) { this.mobilePhone = mobilePhone; } @Column(name = "officePhone", length = 20) public String getOfficePhone() { return this.officePhone; } public void setOfficePhone(String officePhone) { this.officePhone = officePhone; } @Column(name = "email", length = 50) public String getEmail() { return this.email; } public void setEmail(String email) { this.email = email; } /** *方法: 取得java.util.Date *@return: java.util.Date 创建时间 */ @Column(name ="create_date",nullable=true) public java.util.Date getCreateDate(){ return this.createDate; } /** *方法: 设置java.util.Date *@param: java.util.Date 创建时间 */ public void setCreateDate(java.util.Date createDate){ this.createDate = createDate; } /** *方法: 取得java.lang.String *@return: java.lang.String 创建人ID */ @Column(name ="create_by",nullable=true,length=32) public java.lang.String getCreateBy(){ return this.createBy; } /** *方法: 设置java.lang.String *@param: java.lang.String 创建人ID */ public void setCreateBy(java.lang.String createBy){ this.createBy = createBy; } /** *方法: 取得java.lang.String *@return: java.lang.String 创建人名称 */ @Column(name ="create_name",nullable=true,length=32) public java.lang.String getCreateName(){ return this.createName; } /** *方法: 设置java.lang.String *@param: java.lang.String 创建人名称 */ public void setCreateName(java.lang.String createName){ this.createName = createName; } /** *方法: 取得java.util.Date *@return: java.util.Date 修改时间 */ @Column(name ="update_date",nullable=true) public java.util.Date getUpdateDate(){ return this.updateDate; } /** *方法: 设置java.util.Date *@param: java.util.Date 修改时间 */ public void setUpdateDate(java.util.Date updateDate){ this.updateDate = updateDate; } /** *方法: 取得java.lang.String *@return: java.lang.String 修改人ID */ @Column(name ="update_by",nullable=true,length=32) public java.lang.String getUpdateBy(){ return this.updateBy; } /** *方法: 设置java.lang.String *@param: java.lang.String 修改人ID */ public void setUpdateBy(java.lang.String updateBy){ this.updateBy = updateBy; } /** *方法: 取得java.lang.String *@return: java.lang.String 修改人名称 */ @Column(name ="update_name",nullable=true,length=32) public java.lang.String getUpdateName(){ return this.updateName; } /** *方法: 设置java.lang.String *@param: java.lang.String 修改人名称 */ public void setUpdateName(java.lang.String updateName){ this.updateName = updateName; } @Column(name ="last_slt_orgid",nullable=true,length=32) public String getLastSltOrgid() { return lastSltOrgid; } public void setLastSltOrgid(String lastSltOrgid) { this.lastSltOrgid = lastSltOrgid; } /** * 获取性别 * @return */ @Column(name ="sex",nullable=true,length=1) public Integer getSex() { return sex; } /** * 设置性别 * @param sex */ public void setSex(Integer sex) { this.sex = sex; } /** * 获取生日 * @return */ @Column(name ="birthday",nullable=true) public Date getBirthday() { return birthday; } /** * 设置生日 * @param birthday */ public void setBirthday(Date birthday) { this.birthday = birthday; } /** * 获取职务 * @return */ @Column(name ="job_title",nullable=true,length = 100) public String getJobTitle() { return jobTitle; } /** * 设置职务 * @param jobTitle */ public void setJobTitle(String jobTitle) { this.jobTitle = jobTitle; } /** * 获取办公司 * @return */ @Column(name ="office",nullable=true,length = 200) public String getOffice() { return office; } /** * 设置办公司 * @param office */ public void setOffice(String office) { this.office = office; } @Column(name = "checkPhone", length = 30) public String getCheckPhone() { return this.checkPhone; } public void setCheckPhone(String checkPhone) { this.checkPhone = checkPhone; } /** * 获取头像 * @return */ @Column(name ="headpic",nullable=true,length = 200) public String getHeadPic() { return headPic; } /** * 设置头像 * @param headPic */ public void setHeadPic(String headPic) { this.headPic = headPic; } /** * 获取QQ号码 * @return */ @Column(name ="qq",nullable=true,length = 20) public String getQq() { return qq; } /** * 设置QQ号码 * @param qq */ public void setQq(String qq) { this.qq = qq; } /** * 获取工号 * @return */ @Column(name ="job_number",nullable=true,length = 50) public String getJobNumber() { return jobNumber; } /** * 设置工号 * @param jobNumber */ public void setJobNumber(String jobNumber) { this.jobNumber = jobNumber; } /** * 获得用户邀请码 * @return */ @Column(name ="inviteCode",nullable=true,length = 6) public String getInviteCode() { return inviteCode; } /** * 设置用户邀请码 * @param inviteCode */ public void setInviteCode(String inviteCode) { this.inviteCode = inviteCode; } @OneToOne(optional = true,cascade = CascadeType.ALL,mappedBy = "user") public TokenEntity getTokenInfo() { return tokenInfo; } public void setTokenInfo(TokenEntity tokenInfo) { this.tokenInfo = tokenInfo; } @Column(name = "version") public BigInteger getVersion() { return version; } public void setVersion(BigInteger version) { this.version = version; } @ManyToOne(cascade=CascadeType.ALL) @JoinColumn(name="id",referencedColumnName="user_id",unique=true,nullable=false,insertable = false,updatable = false) public TSUserSerialNumber getUserSerialNumber() { return userSerialNumber; } public void setUserSerialNumber(TSUserSerialNumber userSerialNumber) { this.userSerialNumber = userSerialNumber; } }
表t_s_user_serial_number的实体类:
package org.jeecgframework.web.system.pojo.base; import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicUpdate; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; import java.io.Serializable; import java.math.BigInteger; /** * 系统用户序号 * Created by chenguo on 2017/6/14. */ @Entity @Table(name = "t_s_user_serial_number") @DynamicUpdate(true) @DynamicInsert(true) public class TSUserSerialNumber implements Serializable { /** * 用户序号 */ private BigInteger sn; /** * 用户id */ private String userId; @Id @GeneratedValue(generator = "serialNumber") @GenericGenerator(name = "serialNumber", strategy = "increment") @Column(name = "sn", nullable = false) public BigInteger getSn() { return sn; } public void setSn(BigInteger sn) { this.sn = sn; } @Column(name = "user_id", nullable = false) public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } }
关键的注解就在TSUser实体类中:
/**用户序号**/ private TSUserSerialNumber userSerialNumber; @ManyToOne(cascade=CascadeType.ALL) @JoinColumn(name="id",referencedColumnName="user_id",unique=true,nullable=false,insertable = false,updatable = false) public TSUserSerialNumber getUserSerialNumber() { return userSerialNumber; } public void setUserSerialNumber(TSUserSerialNumber userSerialNumber) { this.userSerialNumber = userSerialNumber; }
只需要上面的配置,虽然使用的@ManyToOne,但是取出来的数据还是一对一的关系,用户表中的ID是一定的,用户序号表中的user_id字段也是唯一的,但是使用
@OneToOne,可能在referencedColumnName="user_id",指定的时候可能无效,可以再去测试一下。可能新版本已经解决了这个问题。
相关文章推荐
- Hibernate注解配置1:1关联
- hibernate中配置非主键关联(单向一对多)
- Hibernate中用注解配置一对多双向关联和多对一单向关联
- Hibernate5:Hibernate框架下的基于注解配置的多表关联的入门级例子(完整版)
- hibernate双向一对一主键关联映射XML与注解版
- Hibernate注解配置1:N关联
- hibernate(jpa)中注解配置字段为主键
- hibernate 注解 ,视图无主键,怎么配置联合主键
- [转] hibernate Mysql 自增长 注解配置,表无关联的注解方式关联查询
- Hibernate中用注解配置一对多双向关联和多对一单向关联
- hibernate Mysql 自增长 注解配置,表无关联的注解方式关联查询
- Hibernate注解:一对一主键关联
- Hibernate一对一关联(共享主键) 注解 || xml
- SS6.1_Hibernate_Hibernate_IdStrategyAnnotation 主键生成策略native Annotation注解的配置方式
- hibernate中配置非主键关联(单向一对多)
- Hibernate联合主键关联(Annotation配置)
- Hibernate一对一主键关联(基于annotation注解方式)
- hibernate联合主键注解配置
- hibernate注解配置关联
- SS6.2_Hibernate_Hibernate_IdStrategyAnnotation 主键生成策略uuid Annotation注解的配置方式