Spring Data JPA:关联映射操作
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:关联映射操作的更多相关文章
- 【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 ...
- spring data jpa使用懒操作
如果model对象的某属性使用lazy load,调用这个属性时会报错, failed to lazily initialize a collection of role could not init ...
- spring data jpa关联查询(一对一、一对多、多对多)
在实际过往的项目中,常用的查询操作有:1.单表查询,2.一对一查询(主表和详情表)3.一对多查询(一张主表,多张子表)4.多对多查询(如权限控制,用户.角色多对多).做个总结,所以废话不多说. 使用i ...
- spring data jpa的update操作
简介 使用jpa进行update操作主要有两种方式: 1.调用保存实体的方法 1)保存一个实体:repository.save(T entity) 2)保存多个实体:repository.save(I ...
- Spring Data JPA 关系映射(一对一,一对多,多对多 )
CascadeType.REMOVE 级联删除操作,删除当前实体时,与它有映射关系的实体也会跟着被删除.CascadeType.MERGE 级联更新(合并)操作,当Student中的数据改变,会相应地 ...
- spring data jpa 关联设计
MAP关联实体 // @ElementCollection @OneToMany(cascade = {CascadeType.ALL})// @JoinColumn(name = "the ...
- SpringBoot整合持久层技术--(三)Spring Data JPA
简介: JPA(java Persistence API)和SpringData是两个范畴的概念.spring data jpa是spring公司下的spring data项目的一个模块. sprin ...
- Spring Data JPA 学习记录1 -- 单向1:N关联的一些问题
开新坑 开新坑了(笑)....公司项目使用的是Spring Data JPA做持久化框架....学习了一段时间以后发现了一点值得注意的小问题.....与大家分享 主要是针对1:N单向关联产生的一系列问 ...
- Spring Boot使用Spring Data Jpa对MySQL数据库进行CRUD操作
只需两步!Eclipse+Maven快速构建第一个Spring Boot项目 构建了第一个Spring Boot项目. Spring Boot连接MySQL数据库 连接了MySQL数据库. 本文在之前 ...
- Spring Boot (五)Spring Data JPA 操作 MySQL 8
一.Spring Data JPA 介绍 JPA(Java Persistence API)Java持久化API,是 Java 持久化的标准规范,Hibernate是持久化规范的技术实现,而Sprin ...
随机推荐
- 【C++】C++中基类的析构函数为什么要用virtual虚析构函数?
正面回答: 当基类的析构函数不是虚函数,并且基类指针指向一个派生类对象,然后通过基类指针来删除这个派生类对象时,如果基类的析构函数不是虚析构函数,那么派生类的析构函数就不会被调用,从而产生内存泄漏 # ...
- AQS工作原理分析
AQS工作原理分析 一.大致介绍1.前面章节讲解了一下CAS,简单讲就是cmpxchg+lock的原子操作:2.而在谈到并发操作里面,我们不得不谈到AQS,JDK的源码里面好多并发的类都是通过Sy ...
- PowerBuilder学习笔记之1开发环境
Powerbuilder Classic 12.5开发环境(PB经典 12.5) 教材链接:https://wenku.baidu.com/view/5e087d6ab9f67c1cfad6195f3 ...
- [Atcoder AGC029C]Lexicographic constraints
题目大意:给定$n$个字符串的长度$a_i$,问至少用几种字符可以构造出字符串$s_1\sim s_n$,满足$|s_i|=a_i$且$s_1<s_2<\cdots<s_n$. $ ...
- 『cdq分治和多维偏序问题』
更新了三维偏序问题的拓展 cdq分治 \(cdq\)分治是一种由\(IOI\ Au\)选手\(cdq\)提出的离线分治算法,又称基于时间的分治算法. 二维偏序问题 这是\(cdq\)分治最早提出的时候 ...
- golang --- map如何判断key是否存在
判断方式为value,ok := map[key], ok为true则存在 package main import "fmt" func main() { demo := map[ ...
- .NET Core中如何对Url进行编码和解码
我们在.NET Core项目中,可以用WebUtility类对Url进行编码和解码,首先我们要确保项目中引入了nuget包:System.Runtime.Extensions 当然这个nuget包默认 ...
- Git 理解修改
参考链接:https://www.liaoxuefeng.com/wiki/896043488029600/897884457270432 Git之所以比其他版本控制系统设计得优秀,就是因为Git跟踪 ...
- python爬虫---scrapy框架爬取图片,scrapy手动发送请求,发送post请求,提升爬取效率,请求传参(meta),五大核心组件,中间件
# settings 配置 UA USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, l ...
- 关于ionic2在IOS上点击延迟的问题
正常的点击事件, 不知道 为什么 ,在IOS上明显会延迟几百毫秒.. 加上tappable属性就可以解决了 <div tappable (click)="doClick()" ...