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"); } }); }效果展示: