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. Windows域的创建与加入教程

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

  2. js2048小游戏

    js2048小游戏,方格是怎么合并和移动的 index.html <html> <head> <meta charset="utf-8"> &l ...

  3. ElasticSearch 线程池类型分析之SizeBlockingQueue

    ElasticSearch 线程池类型分析之SizeBlockingQueue 尽管前面写好几篇ES线程池分析的文章(见文末参考链接),但都不太满意.但从ES的线程池中了解到了不少JAVA线程池的使用 ...

  4. Linux文件目录指令

    1.pwd指令 pwd 显示当前所在的目录 2.ls指令 ls [选项] [目录或文件] 查看文件信息 ls -a 查看所有文件和目录,包括隐藏的 ls -l 以列表的方式显示 3.cd指令 cd 路 ...

  5. golang知识精要(二)

    类型 go是**静态类型**语言,不能在运行期改变变量类型. 变量定义 使用var定义变量,自动初始化为零值: 如果提供初始值,可省略变量类型: 函数内部可使用:=定义变量. var x int // ...

  6. k8s-Label(标签)

    k8s-Label(标签) 一.Label是什么? Label是Kubernetes系统中的一个核心概念.Label以key/value键值对的形式附加到各种对象上,如Pod.Service.RC.N ...

  7. CSAPP第二章show_bytes函数的探究

    CSAPP第二章中给出了一个帮助我们观察数据的位模式的函数--show_bytes函数,具体实现如下: #include<stdio.h> typedef unsigned char *b ...

  8. RabbitMQ学习之Publish/Subscribe(3)

    上一个教程中,我们创建了一个work queue. 其中的每个task都会被精确的传送到一个worker. 这节,我们将会讲把一个message传送到多个consumers. 这种模式叫做publis ...

  9. Elasticsearch DSL 常用语法介绍

    课程环境 CentOS 7.3 x64 JDK 版本:1.8(最低要求),主推:JDK 1.8.0_121 Elasticsearch 版本:5.2.0 相关软件包百度云下载地址(密码:0yzd):h ...

  10. bytearray与矩阵转换对应关系

    import numpy as npimport osa=bytearray(os.urandom(27))# for i in range(21):# print(a[i])a=np.array(a ...