1.一对一的关系关联

需求:用户和角色一对一关联

package com.example.jpa.pojo;

import javax.persistence.*;

@Entity
@Table(name = "t_user")
public class User { @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name;
/**
* CascadeType.PERSIST 只有User类新增时,
* 会级联Role对象新增。若Role对象在数据库存(跟新)在则抛异常(让Role变为持久态)
*/
@OneToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "role_id") //JoinColumn:维护一个外键的作用
private Role role; public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Role getRole() {
return role;
} public void setRole(Role role) {
this.role = role;
}
}
package com.example.jpa.pojo;

import javax.persistence.*;

@Entity
@Table(name = "t_role")
public class Role { @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name;
@OneToOne(mappedBy = "role")
private User user; public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
}
}
 /**
* 添加用户同时添加角色
*/
@Test
public void test1()
{
//创建角色
Role role =new Role();
role.setName("小角色"); //创建用户
User user =new User();
user.setName("小用户"); //建立关系
user.setRole(role);
role.setUser(user); //保存数据
userRepository.save(user);
} /**
* 根据用户id查询用户,同时查询用户角色
*/
@Test
public void test2()
{
User user =userRepository.getOne((long)13);
System.out.println(user);
Role role = user.getRole();
System.out.println(role); }

2.一对多关联关系

需求:从角色到用户的一对多关联关系

package com.example.jpa.pojo;

import javax.persistence.*;

@Entity
@Table(name = "t_user")
public class User { @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name; @ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "role_id")
private Role role; public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Role getRole() {
return role;
} public void setRole(Role role) {
this.role = role;
}
}
package com.example.jpa.pojo;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set; @Entity
@Table(name = "t_role")
public class Role { @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name; @OneToMany(mappedBy = "role")
private Set<User> userSet = new HashSet<>(); public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Set<User> getUserSet() {
return userSet;
} public void setUserSet(Set<User> userSet) {
this.userSet = userSet;
}
}
 /**
* 添加用户同时添加角色
*/
@Test
public void test1()
{
//创建角色
Role role =new Role();
role.setName("小角色"); //创建用户
User user =new User();
user.setName("小用户"); //建立关系
user.setRole(role);
role.getUserSet().add(user); //保存数据
userRepository.save(user);
} /**
* 根据用户id查询用户,同时查询用户角色
*/
@Test
public void test2()
{
User user =userRepository.getOne((long)13);
System.out.println(user);
Role role = user.getRole();
System.out.println(role); }

3.多对多的关联关系

需求:用户和角色多对多关系

package com.example.jpa.pojo;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set; @Entity
@Table(name = "t_user")
public class User { @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name; @ManyToMany(cascade = CascadeType.PERSIST,fetch = FetchType.EAGER) //fetch = FetchType.EAGER:异步加载
//JoinTable 配置中间表信息
//joinColumns 建立当前表在中间表中的外键字段
@JoinTable(name = "t_user_role",joinColumns = @JoinColumn(name = "user_id")
,inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles =new HashSet<>(); public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Set<Role> getRoles() {
return roles;
} public void setRoles(Set<Role> roles) {
this.roles = roles;
}
}
package com.example.jpa.pojo;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set; @Entity
@Table(name = "t_role")
public class Role { @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name; @ManyToMany(mappedBy = "roles")
private Set<User> users =new HashSet<>(); public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Set<User> getUsers() {
return users;
} public void setUsers(Set<User> users) {
this.users = users;
}
}
    /**
* 添加用户同时添加角色
*/
@Test
public void test1()
{
//创建角色
Role role =new Role();
role.setName("小角色"); //创建用户
User user1 =new User();
user1.setName("小用户1"); User user2 =new User();
user2.setName("小用户2"); //建立关系
role.getUsers().add(user1);
role.getUsers().add(user2);
user1.getRoles().add(role);
user2.getRoles().add(role); //保存数据
userRepository.save(user1);
userRepository.save(user2);
} /**
* 根据用户id查询用户,同时查询用户所有角色
*/
@Test
public void test2()
{
User user =userRepository.getOne((long)13);
System.out.println(user);
Set<Role> roles = user.getRoles();
System.out.println(roles); }

Spring Data JPA:关联映射操作的更多相关文章

  1. 【spring data jpa】使用spring data jpa 的删除操作,需要加注解@Modifying @Transactional 否则报错如下: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call

    使用spring data jpa 的删除操作,需要加注解@Modifying     @Transactional 否则报错如下: No EntityManager with actual tran ...

  2. spring data jpa使用懒操作

    如果model对象的某属性使用lazy load,调用这个属性时会报错, failed to lazily initialize a collection of role could not init ...

  3. spring data jpa关联查询(一对一、一对多、多对多)

    在实际过往的项目中,常用的查询操作有:1.单表查询,2.一对一查询(主表和详情表)3.一对多查询(一张主表,多张子表)4.多对多查询(如权限控制,用户.角色多对多).做个总结,所以废话不多说. 使用i ...

  4. spring data jpa的update操作

    简介 使用jpa进行update操作主要有两种方式: 1.调用保存实体的方法 1)保存一个实体:repository.save(T entity) 2)保存多个实体:repository.save(I ...

  5. Spring Data JPA 关系映射(一对一,一对多,多对多 )

    CascadeType.REMOVE 级联删除操作,删除当前实体时,与它有映射关系的实体也会跟着被删除.CascadeType.MERGE 级联更新(合并)操作,当Student中的数据改变,会相应地 ...

  6. spring data jpa 关联设计

    MAP关联实体 // @ElementCollection @OneToMany(cascade = {CascadeType.ALL})// @JoinColumn(name = "the ...

  7. SpringBoot整合持久层技术--(三)Spring Data JPA

    简介: JPA(java Persistence API)和SpringData是两个范畴的概念.spring data jpa是spring公司下的spring data项目的一个模块. sprin ...

  8. Spring Data JPA 学习记录1 -- 单向1:N关联的一些问题

    开新坑 开新坑了(笑)....公司项目使用的是Spring Data JPA做持久化框架....学习了一段时间以后发现了一点值得注意的小问题.....与大家分享 主要是针对1:N单向关联产生的一系列问 ...

  9. Spring Boot使用Spring Data Jpa对MySQL数据库进行CRUD操作

    只需两步!Eclipse+Maven快速构建第一个Spring Boot项目 构建了第一个Spring Boot项目. Spring Boot连接MySQL数据库 连接了MySQL数据库. 本文在之前 ...

  10. Spring Boot (五)Spring Data JPA 操作 MySQL 8

    一.Spring Data JPA 介绍 JPA(Java Persistence API)Java持久化API,是 Java 持久化的标准规范,Hibernate是持久化规范的技术实现,而Sprin ...

随机推荐

  1. es6和es5函数参数和arguments的差别

    注: 这里说的 es5 代表的都是非严格模式下. es6之前函数的参数不能传默认值: function fn(a, b){ console.log(a) console.log(b) } fn(2) ...

  2. Windows域的创建与加入教程

    一.说明 以前看书的时候时常看到“域”这个词,后来听一些渗透的演讲通常会说进入内网后首先要找域控.在认知中“域控”应该是域管理服务器一类的东西,但毕竟没有实现过所以还是不太懂长什么样. 前段时间朋友电 ...

  3. Modbus 协议-Ascii,RTU

    Modbus 协议之 Ascii 下载地址:http://download.csdn.net/detail/woxpp/5043249 1.提供Modbus Ascii 相关发送与接收代码 2.提供M ...

  4. .netcore docker noe4j

    1.借用docker搭建noe4j环境 docker pull neo4j docker run -d --restart=always -p7474: -p7687: -v /root/docker ...

  5. Debian Stretch升级当前最新稳定版内核

    Why update kernel ? Update the kernel to new version fixed some newer hardware has no driver softwar ...

  6. 在linux上安装elasticsearch简称ES 简单介绍安装步骤

    1.简介 Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 ...

  7. SQLServer作业调用链接服务器失败解决办法

    新建一个SQL作业,语句手动执行OK,但是作业计划执行总是报错. 消息已以用户 NT SERVICE\SQLSERVERAGENT 的身份执行. 链接服务器 "172.16.10.23&qu ...

  8. soup.select的用法

    1.通过标签选择 # 选择所有title标签 soup.select("title") # 选择所有p标签中的第三个标签 soup.select("p:nth-of-ty ...

  9. 2019 创蓝253java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.创蓝253等公司offer,岗位是Java后端开发,因为发展原因最终选择去了创蓝253,入职一年时间了,也成为 ...

  10. python基础--初始数据结构

    目录: 一.知识点1.IDE 集成开发环境2.字符格式化输出3.数据运算4.循环loop5.数据类型6.列表与元组 二.例子1.输入名字.年龄.工作.薪水,进行格式化的输出.2.for语句实现输入密码 ...