Spring Data JPA 定义实体类关系:一对一
无情
阅读:755
2021-03-31 13:44:26
评论:0
JPA使用@OneToOne来标注一对一的关系。 实体 Dept:部门。 实体 User:用户。 Dept和 User 是一对一的关系。 这里使用关联字段描述JPA的一对一关系。 通过关联字段的方式(一个实体通过关联字段关联到另一个实体的主键); 通过关联字段的方式 Dept表(dept_id,dept_name,dept_tel,dept_fax,email,dept_addr,deptmanager) User表(user_id,phone,zipcode,address,***)
建库脚本:
-- 导出 表 oasys.aoa_dept 结构
CREATE TABLE IF NOT EXISTS `aoa_dept` (
`dept_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '部门ID',
`dept_addr` varchar(255) DEFAULT NULL COMMENT '部门地址',
`dept_fax` varchar(255) DEFAULT NULL COMMENT '部门传真',
`dept_name` varchar(255) DEFAULT NULL COMMENT '部门名称',
`dept_tel` varchar(255) DEFAULT NULL COMMENT '部门电话',
`email` varchar(255) DEFAULT NULL COMMENT '部门邮箱',
`deptmanager` bigint(20) DEFAULT NULL COMMENT '部门管理员',
`end_time` datetime DEFAULT NULL,
`start_time` datetime DEFAULT NULL,
PRIMARY KEY (`dept_id`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- 导出 表 oasys.aoa_user 结构
CREATE TABLE IF NOT EXISTS `aoa_user` (
`user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户id',
`address` varchar(255) DEFAULT NULL COMMENT '地址',
`bank` varchar(255) DEFAULT NULL COMMENT '银行账号',
`birth` datetime DEFAULT NULL COMMENT '生日',
`eamil` varchar(255) DEFAULT NULL COMMENT '邮箱',
`father_id` bigint(20) DEFAULT NULL COMMENT '上级id',
`hire_time` datetime DEFAULT NULL COMMENT '入职时间',
`user_idcard` varchar(255) DEFAULT NULL COMMENT '身份证',
`img_path` varchar(255) DEFAULT NULL COMMENT '用户头像路径',
`is_lock` int(11) DEFAULT NULL COMMENT '该用户是否被禁用',
`last_login_ip` varchar(255) DEFAULT NULL COMMENT '用户最后登录ip',
`last_login_time` datetime DEFAULT NULL COMMENT '最后登录时间',
`modify_time` datetime DEFAULT NULL COMMENT '最后修改时间',
`modify_user_id` bigint(20) DEFAULT NULL COMMENT '最后修改此用户的用户id',
`password` varchar(255) DEFAULT NULL COMMENT '密码',
`real_name` varchar(255) DEFAULT NULL COMMENT '真实姓名',
`salary` float DEFAULT NULL COMMENT '工资',
`user_school` varchar(255) DEFAULT NULL COMMENT '毕业院校',
`sex` varchar(255) DEFAULT NULL COMMENT '性别',
`theme_skin` varchar(255) DEFAULT NULL COMMENT '主题皮肤',
`user_edu` varchar(255) DEFAULT NULL COMMENT '学历',
`user_name` varchar(255) DEFAULT NULL COMMENT '用户名',
`user_sign` varchar(255) DEFAULT NULL COMMENT '用户签名',
`user_tel` varchar(255) DEFAULT NULL COMMENT '电话',
`superman` int(11) DEFAULT NULL,
`holiday` int(11) DEFAULT NULL COMMENT '请假天数',
`pinyin` varchar(255) DEFAULT NULL,
PRIMARY KEY (`user_id`),
) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
功能代码:
实体类文件:
package com.zzg.entity;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.hibernate.validator.constraints.NotEmpty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@SuppressWarnings("serial")
@Entity
@Table(name = "aoa_dept")
@Data // 自动生成get、set、toString、equals方法
@AllArgsConstructor // 全参构造方法
@NoArgsConstructor // 无参构造方法
@Accessors(chain = true) // 链式编程
public class Dept implements java.io.Serializable {
@Id
@Column(name = "dept_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long deptId; //部门id
@Column(name = "dept_name")
@NotEmpty(message="部门名称不为空")
private String deptName; //部门名字 非空 唯一
@Column(name = "dept_tel")
private String deptTel; //部门电话
@Column(name = "dept_fax")
private String deptFax; //部门传真
@Column(name = "email")
private String email; //部门email
@Column(name = "dept_addr")
private String deptAddr; //部门地址
@OneToOne(cascade=CascadeType.ALL) //JPA注释: 一对一 关系
@JoinColumn(name ="deptmanager",referencedColumnName = "user_id")
// @JoinColumn注解中的name元素为被关联对象的id,即Dept类与User中关联字段,而referencedColumnName则为关联对象的id,即User类的user_id即@JoinColumn所在实体类的id。
private User user;
}
package com.zzg.entity;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* 备注:position_id 职位
role_id 角色
dept_id 部门
以上三个外键没有完成
* @author luoxiang
*
*/
@Entity
@Table(name="aoa_user")
@Data // 自动生成get、set、toString、equals方法
@AllArgsConstructor // 全参构造方法
@NoArgsConstructor // 无参构造方法
@Accessors(chain = true) // 链式编程
public class User {
@Id
@Column(name="user_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long userId; //用户id
@Column(name="user_name")
private String userName; //登录用户名
@Column(name="user_tel")
private String userTel; //用户电话
@Column(name="real_name")
private String realName; //真实姓名
private String pinyin;
private String eamil; //邮件
private String address; //地址
@Column(name="user_edu")
private String userEdu; //用户学历
private Boolean superman=false;
@Column(name="user_school")
private String school; //学校
@Column(name="user_idcard")
private String idCard; //用户身份证
private String bank; //银行
private String sex; //性别
@Column(name="theme_skin")
private String themeSkin; //主题皮肤
private Date birth; //生日
@Column(name="user_sign")
private String userSign; //用户签名
private String password; //用户密码
private String salary; //用户薪水
@Column(name="img_path")
private String imgPath; //用户头像路径
@Column(name="hire_time")
private Date hireTime; //入职时间
@Column(name="is_lock")
private Integer isLock=0; //该用户是否被禁用
@Column(name="last_login_ip")
private String lastLoginIp; //用户最后登录ip;
@Column(name="last_login_time")
private Date lastLoginTime; //最后登录时间
@Column(name="modify_time")
private Date modifyTime; //最后修改时间
@Column(name="modify_user_id")
private Long modifyUserId; //最后修改此用户的用户id
@Column(name="father_id")
private Long fatherId; //上司id
private Integer holiday; //请假天数
}
实体类Repository 接口定义:
package com.zzg.entity.dao;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import com.zzg.entity.Dept;
public interface DeptRepository extends JpaRepository<Dept, Integer> {
List<Dept> findByDeptId(Long id);
@Query("select de.deptName from Dept de where de.deptId=:id")
String findname(@Param("id")Long id);
}
package com.zzg.entity.dao;
import org.springframework.data.jpa.repository.JpaRepository;
import com.zzg.entity.User;
public interface UserRepository extends JpaRepository<User, Integer> {
}
功能模块测试:
// 简单查询
@Test
public void selectOneToOne() {
List<Dept> dept=repository.findByDeptId(1L);
dept.stream().forEach(item ->{
Dept objet = item;
System.out.println(objet.getDeptId());
System.out.println(objet.getUser().toString());
});
}
效果展示:
// 简单修改
@Test
public void selectOneToOne() {
List<Dept> dept=repository.findByDeptId(1L);
dept.stream().forEach(item ->{
Dept objet = item;
System.out.println(objet.getDeptId());
if(ObjectUtils.isNotEmpty(objet.getUser())) {
System.out.println(objet.getUser().toString());
} else {
System.out.println("部门管理者为null");
}
});
}
效果展示:
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。