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"); 
			} 
			 
		}); 
		 
	}

 效果展示:

 

标签:Spring
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号